「sudo:ttyが存在せず、askpassプログラムが指定されていません」エラーを修正する方法


437

makefileを使用していくつかのソースをコンパイルしようとしています。makefileには、として実行する必要のあるコマンドの束がありますsudo

端末からソースをコンパイルすると、すべてが正常にsudo実行され、コマンドが最初に実行されてパスワードを待機するときにmakeが一時停止します。パスワードを入力したら、履歴書を作成して完了します。

しかし、NetBeansでソースをコンパイルできるようにしたいと思います。そのため、プロジェクトを開始し、ソースを見つける場所をnetbeansに示しましたが、プロジェクトをコンパイルするとエラーが発生しました。

sudo: no tty present and no askpass program specified

初めてsudoコマンドにヒットしたとき。

私はインターネットで問題を調べましたが、私が見つけたすべてのソリューションは、このユーザーのパスワードを無効にすることを1つ指摘しています。ここで問題のユーザーはrootであるため。やりたくない。

他の解決策はありますか?


3
おもちゃのオペレーティングシステムをコンパイルしています。ブートセクターで仮想HDDを作成するなど、VMをセットアップするためにいくつかのことを行う必要があります。
hebbo 14


serverfault.com/a/597268で指摘されsudo -n my-commandているように、私のために働いた。こんにちは!
andreyevbr 2017

1
答えを選んでください。
ichimaru 2018年

1
@andreyevbr私はそうは思いません。sudo: a password is required
ichimaru 2018年

回答:


260

パスワードを要求せずにそのコマンドを使用することをユーザーに許可すると、問題が解決するはずです。最初にシェルコンソールを開き、次のように入力します。

sudo visudo

次に、そのファイルを編集して、最後に追加します。

username ALL = NOPASSWD: /fullpath/to/command, /fullpath/to/othercommand

例えば

john ALL = NOPASSWD: /sbin/poweroff, /sbin/start, /sbin/stop

ユーザーをできるようになりますjohnsudoをするpoweroffstartおよびstopパスワードの入力を求められず。

画面の下部でvisudoで使用する必要のあるキーストロークを探します-これはviではありません-問題の最初の兆候で保存せずに終了します。健康に関する警告:このファイルを破損すると深刻な結果を招きます。注意して編集してください!


4
はい、sudoersのmanページで、sudoが実際にどのように使用されることになっているのかがわかりました。
スペンサーウィリアムズ、

6
visudoは、環境が使用するように設定されているエディタで開く必要があります。これは、viである可能性があります(^ _ ^である必要があります)。
Matt Styles

8
NOPASSWDフラグのない他のsudo行(%wheelなど)と一致する可能性のある他のsudo行の後にNOPASSWDメイティング行があることを確認してください。
アンソニー2016年

27
そもそもsudoができないので「sudo visudo」はできません!
グバトロン2016

8
/etc/sudoers.dにファイルを追加し、visudoファイルはそのままにしておくことを検討してください。
xlttj 2017年

183

試してください:

  1. NOPASSWDすべてのコマンドに行を使用します。つまり、

    jenkins ALL=(ALL) NOPASSWD: ALL
    
  2. sudoersファイル内の他のすべての行の後に行を置きます。

これでうまくいきました(Ubuntu 14.04)。


13
最初に他のユーザー設定の後にこの行を追加しましたが、lubuntu 14.04.1のファイルの最後の行として配置した場合にのみ機能しました。
user77115

2番目の部分は、私が必要としていたソリューションでした。既存の設定行(ホイールグループ用)もsudoコマンドと一致しましたが、NOPASSWD:エントリがありませんでした。新しい行に優先順位を付けて配置すると、必要な特定のコマンドにパスワードを使用できなくなります。
anthony 2016年

5
@ user77115が述べたように、これはUbuntu 16.04でも、sudoersファイルの最後の行として配置した場合にのみ機能しました。補足として、すべてのコマンドに対してjenkinsにsudo権限を与えることは、かなり大きなセキュリティ上の懸念事項です。:あなたのジェンキンススクリプトをラップして、特定のアクセス権を与えることを検討することなどのコマンド jenkins ALL=(ALL) NOPASSWD: /var/lib/jenkins/wrapper_script
ivandov

jenkins単なるユーザー名ですか?ホストマシンからのユーザーのユーザー名である必要がありますか?ホストマシンのユーザー名がリモートサーバーのユーザー名と一致する場合はどうなりますか?
mrgloom 2017年

これはジェンキンス固有で、stackoverflow.com / a / 22651598/1041319 がより一般的なソリューションのように見えます。
arntg 2017年

167

試してください:

ssh -t remotehost "sudo <cmd>"

これにより、上記のエラーが削除されます。


7
-t Force pseudo-tty allocation. This can be used to execute arbitrary screen-based programs on a remote machine参照:sudo-no-tty-present-and-no-askpass-program-specified askpassプログラムをsudo -A設定すること もできますが、sudoGUIしか表示されません。誰もが許可するアスクパスを知っていますssh remotehost sudo -A askpassか?
ここでは

1
修正、-Afor sudoは引数をとらず、代わりに環境が必要でありSUDO_ASKPASSsudo.conf So ssh remotehost sudo -A commandは引き続き機能します。ターミナルベースのaskpassプログラムにまだ興味があります。
ここでは

7
これは私にとっては機能しません(おそらく私がスクリプトからsshを呼び出しているためです)。エラーPseudo-terminal will not be allocated because stdin is not a terminal.:(
knocte

私にとってはうまくいきます。ありがとう!
xfra35 2017年

1
これは質問の答えにはなりません。
bschlueter 2017

125

すべての選択肢の後、私は見つけました:

sudo -S <cmd>

-S(stdin)オプションを使用すると、sudoは端末デバイスではなく標準入力からパスワードを読み取ります。

ソース

上記のコマンドでは、パスワードを入力する必要があります。jenkinsなどの場合、手動でパスワードを入力しないようにするには、次のコマンドを使用します。

echo <password> | sudo -S <cmd> 

これで問題が解決したようです。しかし、このコマンドを使用することによる副作用はありますか?
暁東チー

3
sudo -S <command>- trueたまたま、終了コード0を返すダミーコマンドです(false1を返すコマンドです)。他のすべての人が「sudo」が機能することを期待しているため、これが1つの真の答えです。
Adam Plocher

1
-S:端末デバイスを使用する代わりに、プロンプトを標準エラーに書き込み、標準入力からパスワードを読み取ります。パスワードの後に​​は改行文字を続ける必要があります。
fileinster

これはすぐに機能し、タイムアウトになるまでsudoが機能する可能性がありますが、存在する可能性のある根本的な問題には対処しないため、問題が再発する可能性があります。
nealmcb 2017

私はそれが機能するかどうかはわかりませんが、それを示すPassword:と何も起こりません パスワードを入力できません。
ichimaru 2018年

43

sudoデフォルトでは、接続された端末からパスワードを読み取ります。あなたの問題は、それがnetbeansコンソールから実行されたときに接続された端末がないということです。したがって、パスワードを入力する別の方法を使用する必要があります。これは、askpassプログラムと呼ばれます。

askpassパッケージのプログラムは、特定のプログラムが、パスワードの入力を求めることができます任意のプログラムではありません。たとえば、私のシステムでx11-ssh-askpassは正常に動作します。

これを行うには、使用するプログラムを環境変数SUDO_ASKPASSまたはsudo.confファイルで指定する必要があります(詳細はman sudoを参照)。

sudoオプションを使用すると、askpassプログラムを強制的に使用できます-A。デフォルトでは、接続されている端末がない場合にのみ使用します。


現在のソリューションにはGUIが必要です。端末で機能するaskpassプログラム。
ここでは

@here:まあ...端末からsshを実行する場合、直接パスワードを要求するので、特別なことは必要ありません...または、パスワードを要求する端末とは別の端末からパスワードを要求することについて尋ねていますか? sshセッションを実行しますか?
rodrigo 14

1
ああ今私はそれ-Aが引数を取らないのを見る。 -A環境SUDO_ASKPASSまたはsudo.confファイルが必要です。その場合ssh host "export SUDO_ASKPASS=askpass;sudo -A cat /etc/passwd"でも、ターミナルベースのアスクパスで動作しますが、@ chandruは以下のようにはるかに簡潔ですssh -t ...
ここでは

-Aを使用すると、いくつかの注意事項があります。まず、-Aが使用され、SUDO_ASKPASSが設定されていない場合、エラーが発生します。次に、-Aを使用すると、sshはキャッシュされた資格情報を使用せず、常にパスワードを要求します。
アンソニー

adendumとして、あなたは、パスワード入力プログラムに私のノートを見たいことがあります... ict.griffith.edu.au/anthony/info/crypto/passwd_input.txt
アンソニー

26

Ubuntu 16.04ユーザーの場合

あなたが読まなければならないファイルがあります:

cat /etc/sudoers.d/README

モード0440のファイルを/etc/sudoers.d/myuserに次の内容で配置します。

myuser  ALL=(ALL) NOPASSWD: ALL

問題を修正する必要があります。

するのを忘れないで:

chmod 0440 /etc/sudoers.d/myuser

いいね。人気のソリューションよりもクリーンなソリューション。
Paul Praet、2017年

2
これを盲目的にフォローしないでください。ここで説明するように/etc/sudoers.dに新しいファイルを作成し、sudoを使用できなくなった。リカバリモードでファイルを削除する必要があった。
Stian

25

これを試してください:

echo '' | sudo -S my_command

それは私にとってはうまくいきますが、なぜそれが役立つのか誰でも説明できますか?
ololobus

@ololobusあなたはパスワードを入力する最初のプロンプトに空のパスワードを送信します
Nikita Koksharov

働きました!より高い評価の答えのどれも私のためにそれを解決しませんでした。
drerD 2017

1
次のエラーが返されます:[sudo] password for alper: Sorry, try again. [sudo] password for alper: sudo: 1 incorrect password attempt @sNICkerssss
alper

16

Windows10に付属しているUbuntuの中でsudoができないので、万が一ここに来た場合

  1. Windowsから/ etc / hostsファイルを編集し(メモ帳を使用)、次の場所に配置されます:%localappdata\lxss\rootfs\etc、追加127.0.0.1 WINDOWS8、これにより、ホストが見つからないという最初のエラーが解消されます。

  2. no tty presentエラーを取り除くには、常にsudo -S <command>


2
質問の説明とは無関係であるが、質問のタイトルは一致する理由でここに来た人々に回答を提供してくれてありがとう。+1
Jayant Bhawal


15

Linuxにログインします。次のコマンドを実行します。sudoerの編集は危険な命題なので、注意してください。

$ sudo visudo

viエディターが開いたら、次の変更を行います。

  1. コメントアウト Defaults requiretty

    # Defaults    requiretty
    
  2. ファイルの最後に移動して追加します

    jenkins ALL=(ALL) NOPASSWD: ALL
    


11

これは私のために働きました:

echo "myuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

ユーザーが「myuser」の場合

Dockerイメージの場合、次のようになります。

RUN echo "myuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

9

使用するコマンドsudoがの一部であることを確認してくださいPATH

コマンドsudoersエントリが1つ(またはすべてではなく複数)あるsudo: no tty present and no askpass program specified場合、コマンドがパスの一部でない場合(およびフルパスが指定されていない場合)はを取得します。

コマンドをに追加するかPATH、絶対パスで呼び出すことで修正できます。

sudo /usr/sbin/ipset

の代わりに

sudo ipset


1
これは実際には私のためにフォークされています。in sudoers %sitd ALL=(lamparna) NOPASSWD: /usr/bin/git_push_to_lamparna.sh, /usr/bin/gitsudo -u lamparna git push --mirror ssh://lamparna@REDMINE/home/lamparna/repos/git/jine/lamparna.gitgit post-updateフックreturn no ttyを使用していsudo -u lamparna /usr/bin/git push --mirror ssh://lamparna@REDMINE/home/lamparna/repos/git/jine/lamparna.gitますが、パスワードなしで作業を使用しています。
Foton

7

sudorootパスワードでプロンプトを表示しようとしているため、(スクリプトの一部であるため)疑似ttyが割り当てられていないため、コマンドは失敗します。

このコマンドを実行するには、rootとしてログインするか、次のルールを/etc/sudoers (または:)に設定する必要がありますsudo visudo

# Members of the admin group may gain root privileges.
%admin  ALL=(ALL) NOPASSWD:ALL

次に、ユーザーがadminグループ(またはwheel)に属していることを確認します。

理想的には(安全)、次のように指定できる特定のコマンドのみにroot権限を制限することです %admin ALL=(ALL) NOPASSWD:/path/to/program


私が知っていることは、それがはるかに安全な方法です。ただし、次のコマンドをsudoersファイルに記述しましたapache ALL = (ALL) NOPASSWD:/usr/share/apache-tomcat-7.0.61/bin/startup.shが、動作しません。次のエラーが発生しますsudo: >>> /etc/sudoers: syntax error near line 120 <<< sudo: parse error in /etc/sudoers near line 120 sudo: no valid sudoers sources found, quitting sudo: unable to initialize policy plugin
muaaz

1
ところで、それはうまく機能しますapache ALL=(ALL) NOPASSWD: ALLが、セキュリティ上のリスクがあります。:)
muaaz 2015年

6

私は私のケースで誰かを助けることができると思います。

まず、/etc/sudoers上記の回答を参考にユーザー設定を変更しました。しかし、それでも機能しませんでした。

myuser   ALL=(ALL) NOPASSWD: ALL
%mygroup  ALL=(ALL:ALL) ALL

私の場合、myuserにありましたmygroup

そして、私はグループを必要としませんでした。そのため、その行を削除しました。

(私のようにその行を削除せず、コメントをマークするだけです。)

myuser   ALL=(ALL) NOPASSWD: ALL

できます!


3

jenkinsからのsudoコマンドを含むシェルスクリプトを実行すると、期待どおりに実行されない場合があります。これを修正するには、以下に従ってください

簡単な手順:

  1. Ubuntuベースのシステムでは、「$ sudo visudo」を実行します

  2. これにより、/ etc / sudoersファイルが開きます。

  3. jenkinsユーザーがすでにそのファイルにある場合は、次のように変更します。

jenkins ALL =(ALL)NOPASSWD:ALL

  1. ファイルを保存する

  2. ジェンキンスの仕事を再開する

  3. あなたはそのエラーメッセージを再び見るべきではありません:)


3

私はこれを行うことができましたが、手順を適切に実行するようにしてください。これは、インポートエラーが発生している人のためのものです。

手順1:ファイルとフォルダに実行権限の問題があるかどうかを確認します。Linuxユーザーの使用:

chmod 777 filename

Step2:実行権限のあるユーザーを確認してください。

手順3:ターミナルを開くこのコマンドを入力します。

sudo visudo

この行を以下のコードに追加します

www-data ALL=(ALL) NOPASSWD:ALL
nobody ALL=(ALL) NOPASSWD:/ALL

これは、スクリプトを実行する許可を与え、すべてのライブラリを使用できるようにするためです。ユーザーは通常「nobody」または「www-data」です。

コードを次のように編集します

echo shell_exec('sudo -u the_user_of_the_file python your_file_name.py 2>&1');

端末に移動して、プロセスが実行されているかどうかを確認します。

ps aux | grep python

これにより、Pythonで実行されているすべてのプロセスが出力されます。

アドオン:以下のコードを使用して、システム内のユーザーを確認します

cut -d: -f1 /etc/passwd

ありがとうございました!


2

このエラーはsudo ls、Rubyプログラムから(バッククォート内など)いくつかの非シェルスクリプトから(rootパスワードが必要な)端末コマンドを実行しようとしたときにも発生する可能性があります。この場合、Expectユーティリティ(http://en.wikipedia.org/wiki/Expect)またはその代替手段を使用できます。
たとえば、Rubyでget sudo lsなしで実行するにはsudo: no tty present and no askpass program specified、次のように実行します。

require 'ruby_expect'

exp = RubyExpect::Expect.spawn('sudo ls', :debug => true)
exp.procedure do
    each do
        expect "[sudo] password for _your_username_:" do
            send _your_password_
        end
    end
end

[これはExpect TCL拡張の代替の1つを使用します:ruby_expect gem]。


2

参考までに、他の誰かが同じ問題に遭遇した場合、NOPASSWDパラメータを使用していたため、このエラーは発生しないはずの良い時間にスタックしました。

私が知らなかったのは、ttyがなく、ユーザーが起動しようとしたコマンドが/ etc / sudoersファイルで許可されているコマンドの一部ではない場合、sudoがまったく同じエラーメッセージを表示する可能性があることです。

ここに私の問題のある私のファイルコンテンツの簡単な例:

bguser ALL = NOPASSWD: \
    command_a arg_a, \
    command_b arg_b \
    command_c arg_c

bguserがttyなしで「sudo command_b arg_b」を起動しようとすると(bguserが一部のデーモンに使用されている)、「ttyが存在せず、askpassプログラムが指定されていません」というエラーが発生します。

どうして?

/ etc / sudoersファイルの行末にカンマがないため...

(このような場合の正しいエラーメッセージは「申し訳ありませんが、ユーザーbguserは実行を許可されていません」などであるため、これはsudoのバグではなく、予期された動作であるのかと思います)。


2

ユーザーを単一の実行可能な「systemctl」のみに制限し、visudoファイルを誤って構成したため、このエラーが発生しました。

ここに私が持っていたものがあります:

jenkins ALL=NOPASSWD: systemctl

ただし、実行可能ファイルへのフルパスを含める必要があります。たとえば、デフォルトでパス上にある場合でも、次のようになります。

jenkins ALL=NOPASSWD: /bin/systemctl

これにより、私のjenkinsユーザーはサービスを再起動できますが、完全なrootアクセスはできません


1

あるホストから別のホストに移行する場合は、sudoersファイルでホスト名を確認することを覚えておいてください。

これは私の/ etc / sudoers設定です

User_Alias      POWERUSER = user_name
Cmnd_Alias SKILL = /root/bin/sudo_auth_wrapper.sh
POWERUSER hostname=(root:root) NOPASSWD: SKILL

一致しない場合

uname -a
Linux other_hostname 3.10.17 #1 SMP Wed Oct 23 16:28:33 CDT 2013 x86_64 Intel(R) Core(TM) i3-4130T CPU @ 2.90GHz GenuineIntel GNU/Linux

このエラーがポップアップします:

ttyが存在せず、askpassプログラムが指定されていません


1

NOPASSWDに基づいていない他のオプション:

  • root権限((sudo netbeans)など)でNetbeansを起動します。これにより、おそらくrootでビルドプロセスがフォークされ、sudoが自動的に成功します。
  • suexecを実行するために必要な操作を作成します-それらをrootが所有するようにし、モードを4755に設定します(これにより、当然、マシン上のすべてのユーザーがそれらを実行できます)。これにより、ユーザーはsudoをまったく必要としません。
  • ブートセクターで仮想ハードディスクファイルを作成する場合、sudoはまったく必要ありません。ファイルは単なるファイルであり、ブートセクターは単なるデータです。高度なデバイス転送を行わない限り、仮想マシンでさえルートを必要とする必要はありません。

1

たぶん、答えがそれに一致しなかった理由は不明ですが、sudoを必要とするsshfsをマウントしようとしたときに同じエラーメッセージが表示されました。コマンドは次のようなものです。

sshfs -o sftp_server="/usr/bin/sudo /usr/lib/openssh/sftp-server" user@my.server.tld:/var/www /mnt/sshfs/www

オプションを追加することにより -o debug

sshfs -o debug -o sftp_server="/usr/bin/sudo /usr/lib/openssh/sftp-server" user@my.server.tld:/var/www /mnt/sshfs/www

私はこの質問の同じメッセージを持っていました:

sudo: no tty present and no askpass program specified

だから他の人の答えを読むことで、私は/etc/sudoer.d/usermy.server.tldにファイルを作成するようになりました:

user ALL=NOPASSWD: /usr/lib/openssh/sftp-server

ユーザーに余計な権利を与えずにドライブをマウントできるようになりました。


0

この質問は古いですが、それでも私の多かれ少なかれ最新のシステムに関連しています。(須藤のデバッグモードを有効にした後Debug sudo /var/log/sudo_debug all@info/etc/sudo.conf)私はには/ devとがりました:「/dev is world writable」。したがって、ttyファイルのアクセス権、特にtty / ptsノードが存在するディレクトリのアクセス権確認する必要があるかもしれません。


0

この行を/etc/sudoers(を介してvisudo)に追加すると、パスワードの入力を無効にする必要sudo -Sがなく、エイリアスが機能しない場合(スクリプトがを呼び出すsudo)にこの問題が解決されます。

Defaults visiblepw

もちろん、自分でマニュアルを読んで理解してください。ただしlxc exec instance -- /bin/bash、ネットワークを介してパスワードを出力しないため、LXDコンテナーで実行する場合はかなり安全です。


0

パイプラインを使用:

echo your_pswd | sudo -S your_cmd

ヒアドキュメントの使用:

sudo -S cmd <<eof
pwd
eof
#remember to put the above two lines without "any" indentations.

ターミナルを開いてパスワードを尋ねます(どちらでも機能します):

gnome-terminal -e "sudo cmd"
xterm -e "sudo cmd"

-1

1 / etc / sudoersを開きます

タイプsudo vi /etc/sudoers。これにより、ファイルが編集モードで開きます。

2 Linuxユーザーの追加/変更

Linuxユーザーのエントリを探します。見つかった場合は以下のように変更するか、新しい行を追加します。

<USERNAME> ALL=(ALL) NOPASSWD: ALL

3保存して編集モードを終了します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.