web-dev-qa-db-ja.com

'Sudo:no tty presentとno askpassプログラムが指定されていません'エラーを修正するには?

私はメイクファイルを使っていくつかのソースをコンパイルしようとしています。 makefileにはSudoとして実行する必要があるたくさんのコマンドがあります。

私が端末からソースをコンパイルするとき、すべてうまくいき、パスワードを待ってSudoコマンドが最初に実行されたときにmakeが一時停止されます。パスワードを入力したら、makeを再開して完了します。

しかし、NetBeansでソースをコンパイルできるようにしたいです。それで、私はプロジェクトを始めて、ソースを見つけるためにNetBeansを示しました、しかし、私がプロジェクトをコンパイルするとき、それはエラーを与えます:

Sudo: no tty present and no askpass program specified

初めてSudoコマンドを実行したとき。

私はインターネット上の問題と私が見つけたすべての解決策を一つのことを指摘しました:このユーザーのパスワードを無効にすること。ここで問題のユーザーはrootです。私はそれをしたくありません。

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

337
hebbo

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

Sudo visudo

それからそのファイルを編集して最後に追加します。

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

例えば

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

パスワードを要求されることなく、ユーザーjohnpoweroffstart、およびstopをSudoできるようにします。

あなたがvisudoで使う必要があるキーストロークのためにスクリーンの一番下を見てください - これはちなみにviではありません - そしてどんな問題の最初のサインでも保存せずに終了する健康に関する警告:このファイルを破損すると重大な影響を与えるので、慎重に編集してください。

197
nicdaniau

試してください:

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

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

それは私のために働きました(Ubuntu 14.04)。

143
Fatemeh Jabbari

試してください:

ssh -t remotehost "Sudo <cmd>"

これにより上記のエラーが取り除かれます。

132
user262129

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

Sudo -S <cmd>

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

出典

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

echo <password> | Sudo -S <cmd> 
84
Vingt Cent

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

askpass プログラムは特定のプログラムではなく、パスワードを要求できるプログラムです。例えば私のシステムではx11-ssh-askpassはうまく動きます。

そのためには、環境変数Sudo_ASKPASSまたはSudo.confファイルで、使用するプログラムを指定する必要があります(詳細はman Sudoを参照)。

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

38
rodrigo

これを試してください。

echo '' | Sudo -S my_command
20
sNICkerssss

Ubuntu 16.04をお使いの方へ 

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

cat /etc/sudoers.d/README

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

myuser  ALL=(ALL) NOPASSWD: ALL

問題を解決する必要があります。 

するのを忘れないで: 

chmod 0440 /etc/sudoers.d/myuser
15
Vasili Pascal

あなたがWindows 10に付属のUbuntuの中でSudoすることができないためにあなたがここにやって来たならば

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

  2. no tty presentエラーを取り除くには、常にSudo -S <command>を実行してください。

15
Gubatron

あなたのLinuxにログインしてください。以下のコマンドを実行してください。 sudoerを編集することは危険な提案であるため、注意してください。

$ Sudo visudo

Viエディタが開いたら、以下の変更を加えます。

  1. Defaults requirettyをコメントアウトする

    # Defaults    requiretty
    
  2. ファイルの末尾に移動して追加 

    jenkins ALL=(ALL) NOPASSWD: ALL
    
12
Susil Parida

SudoingしているコマンドがPATHの一部であることを確認してください。

単一(または複数、ただしALLではなく)のコマンドsudoersエントリーがある場合、そのコマンドがパスの一部ではない(そしてフルパスが指定されていない)ときにSudo: no tty present and no askpass program specifiedを取得します。

あなたのPATHにコマンドを追加するか、絶対パスでそれを呼び出すことによってそれを修正することができます。

Sudo /usr/sbin/ipset

の代わりに

Sudo ipset

8
omribahumi

ジェンキンスでは

echo '<your-password>' | Sudo -S command

: -

echo '******' | Sudo -S service nginx restart

パスワードを隠すには Mask Password Plugin を使います。

8
Ankit Gupta

これは私のために働いた:

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

ユーザーが "myuser"である場所

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

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

コマンドSudoは、rootパスワードでプロンプトを表示しようとしていて、擬似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として指定できる特定のコマンドにのみ制限することです。

5
kenorb

JenkinsからSudoコマンドが含まれているシェルスクリプトを実行すると、期待通りに実行されない可能性があります。これを修正するには、一緒に従ってください

簡単なステップ:

  1. Ubuntuベースのシステムでは、 "$ Sudo visudo"を実行してください。

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

  3. あなたのjenkinsユーザーがすでにそのファイルに入っている場合は、次のように修正してください。

jenkins ALL =(ALL)NOPASSWD:ALL

  1. ファイルを保存する

  2. Jenkinsの仕事を再開する 

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

2
Chandra Pal

参考のために、他の誰かが同じ問題に遭遇した場合のために、私は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がいくつかのデーモンに使用されている)、彼は "no tty present and no askpass program specified"というエラーに遭遇します。

どうして?

/ etc/sudoersファイルの行末にコンマがないためです。

(このような場合の正しいエラーメッセージは「すみません、ユーザーbguserの実行は許可されていないなど」と言っているので、これは予想される動作でありSudoのバグではないかと思います)

1
WhiteWinterWolf

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

まず、上記の回答を参考にして/etc/sudoersのユーザー設定を変更しました。しかし、まだうまくいきませんでした。 

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

私の場合、myusermygroupにありました。

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

(私のようにその行を削除してはいけません。単にコメントを付けるだけです。)

myuser   ALL=(ALL) NOPASSWD: ALL

できます!

1
kihoon han

このエラーは、シェルコマンド以外のスクリプト、たとえばRubyプログラムからのSudo lsから端末コマンド(rootパスワードが必要)を実行しようとしたときにも発生する可能性があります。この場合、 Expect utility( http://en.wikipedia.org/wiki/Expect )またはその代替手段を使用できます。
たとえば、Rubyで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]。

1
lakesare

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

これは私が持っていたものです: 

jenkins ALL=NOPASSWD: systemctl

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

jenkins ALL=NOPASSWD: /bin/systemctl

これにより、私のjenkinsユーザーはサービスを再起動できますが、フルルートアクセス権は持ちません。

1
dannrob

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

0
u_Ltd.

あるホストから別のホストに移行した場合、このエラーの原因となる可能性があることは誰にもわかりませんでした。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プログラムも指定されていない

0
Abc Xyz

多分何の答えもそれにマッチしなかったのかという疑問がはっきりしていませんが、Sudoを必要とするsshfsをマウントしようとしたときに同じエラーメッセージが出ました。

sshfs -o sftp_server="/usr/bin/Sudo /usr/lib/openssh/sftp-server" [email protected]:/var/www /mnt/sshfs/www

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

sshfs -o debug -o sftp_server="/usr/bin/Sudo /usr/lib/openssh/sftp-server" [email protected]:/var/www /mnt/sshfs/www

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

Sudo: no tty present and no askpass program specified

だから他の人の答えを読んで私はmy.server.tldの/etc/sudoer.d/userにファイルを作るようになりました:

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

これで、ユーザーに余計な権利を与えずにドライブをマウントできました。

0
JOduMonT

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

  • Root権限((Sudo netbeans)など)でNetbeansを起動すると、おそらくrootでビルドプロセスがフォークされ、Sudoは自動的に成功します。
  • Suexecを実行するために必要な操作を行います - それらをrootに所有させ、modeを4755に設定します。
  • ブートセクタを使用して仮想ハードディスクファイルを作成するのにSudoはまったく必要ないはずです。ファイルは単なるファイルで、ブートセクタは単なるデータです。高度なデバイス転送を行わない限り、仮想マシンでさえも必ずしもrootを必要とするべきではありません。
0
Jon Watte