私はメイクファイルを使っていくつかのソースをコンパイルしようとしています。 makefileにはSudo
として実行する必要があるたくさんのコマンドがあります。
私が端末からソースをコンパイルするとき、すべてうまくいき、パスワードを待ってSudo
コマンドが最初に実行されたときにmakeが一時停止されます。パスワードを入力したら、makeを再開して完了します。
しかし、NetBeansでソースをコンパイルできるようにしたいです。それで、私はプロジェクトを始めて、ソースを見つけるためにNetBeansを示しました、しかし、私がプロジェクトをコンパイルするとき、それはエラーを与えます:
Sudo: no tty present and no askpass program specified
初めてSudo
コマンドを実行したとき。
私はインターネット上の問題と私が見つけたすべての解決策を一つのことを指摘しました:このユーザーのパスワードを無効にすること。ここで問題のユーザーはrootです。私はそれをしたくありません。
他に解決策はありますか?
パスワードを要求せずにそのコマンドを使用するようにユーザーに許可すると、問題が解決します。まずシェルコンソールを開き、次のように入力します。
Sudo visudo
それからそのファイルを編集して最後に追加します。
username ALL = NOPASSWD: /fullpath/to/command, /fullpath/to/othercommand
例えば
john ALL = NOPASSWD: /sbin/poweroff, /sbin/start, /sbin/stop
パスワードを要求されることなく、ユーザーjohn
がpoweroff
、start
、およびstop
をSudoできるようにします。
あなたがvisudoで使う必要があるキーストロークのためにスクリーンの一番下を見てください - これはちなみにviではありません - そしてどんな問題の最初のサインでも保存せずに終了する健康に関する警告:このファイルを破損すると重大な影響を与えるので、慎重に編集してください。
試してください:
すべてのコマンドにNOPASSWD
行を使用します。つまり、
jenkins ALL=(ALL) NOPASSWD: ALL
sudoers
ファイルの他のすべての行の後にその行を入れます。
それは私のために働きました(Ubuntu 14.04)。
試してください:
ssh -t remotehost "Sudo <cmd>"
これにより上記のエラーが取り除かれます。
すべての選択肢の後に、私は見つけました:
Sudo -S <cmd>
-S(標準入力)オプションを指定すると、Sudoは端末デバイスではなく標準入力からパスワードを読み取ります。
上記のコマンドはまだパスワードを入力する必要があります。 jenkinsのような場合にパスワードの手動入力を削除するには、このコマンドを使用します。
echo <password> | Sudo -S <cmd>
デフォルトではSudo
は接続された端末からパスワードを読みます。あなたの問題は、それがnetbeansコンソールから実行されるときに接続されている端末がないということです。そのため、パスワードを入力するには別の方法を使用する必要があります。これは askpass プログラムと呼ばれます。
askpass プログラムは特定のプログラムではなく、パスワードを要求できるプログラムです。例えば私のシステムではx11-ssh-askpass
はうまく動きます。
そのためには、環境変数Sudo_ASKPASS
またはSudo.conf
ファイルで、使用するプログラムを指定する必要があります(詳細はman Sudo
を参照)。
オプション-A
を使うことでSudo
にaskpassプログラムを使わせることができます。デフォルトでは、接続されている端末がない場合にのみ使用されます。
これを試してください。
echo '' | Sudo -S my_command
Ubuntu 16.04をお使いの方へ
あなたが読まなければならないファイルがあります:
cat /etc/sudoers.d/README
以下の内容で、モード0440のファイルを/etc/sudoers.d/myuserに配置します。
myuser ALL=(ALL) NOPASSWD: ALL
問題を解決する必要があります。
するのを忘れないで:
chmod 0440 /etc/sudoers.d/myuser
あなたがWindows 10に付属のUbuntuの中でSudoすることができないためにあなたがここにやって来たならば
(メモ帳を使って)Windowsから/ etc/hostsファイルを編集します。ファイルは%localappdata\lxss\rootfs\etc
に追加され、127.0.0.1 WINDOWS8
を追加します。これにより、ホストが見つからないという最初のエラーがなくなります。
no tty present
エラーを取り除くには、常にSudo -S <command>
を実行してください。
あなたのLinuxにログインしてください。以下のコマンドを実行してください。 sudoerを編集することは危険な提案であるため、注意してください。
$ Sudo visudo
Viエディタが開いたら、以下の変更を加えます。
Defaults requiretty
をコメントアウトする
# Defaults requiretty
ファイルの末尾に移動して追加
jenkins ALL=(ALL) NOPASSWD: ALL
Sudo
ingしているコマンドがPATH
の一部であることを確認してください。
単一(または複数、ただしALLではなく)のコマンドsudoers
エントリーがある場合、そのコマンドがパスの一部ではない(そしてフルパスが指定されていない)ときにSudo: no tty present and no askpass program specified
を取得します。
あなたのPATH
にコマンドを追加するか、絶対パスでそれを呼び出すことによってそれを修正することができます。
Sudo /usr/sbin/ipset
の代わりに
Sudo ipset
ジェンキンスでは :
echo '<your-password>' | Sudo -S command
例 : -
echo '******' | Sudo -S service nginx restart
パスワードを隠すには Mask Password Plugin を使います。
これは私のために働いた:
echo "myuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
ユーザーが "myuser"である場所
dockerイメージの場合は、次のようになります。
RUN echo "myuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
コマンド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
として指定できる特定のコマンドにのみ制限することです。
JenkinsからSudoコマンドが含まれているシェルスクリプトを実行すると、期待通りに実行されない可能性があります。これを修正するには、一緒に従ってください
簡単なステップ:
Ubuntuベースのシステムでは、 "$ Sudo visudo"を実行してください。
これにより/ etc/sudoersファイルが開きます。
jenkins ALL =(ALL)NOPASSWD:ALL
ファイルを保存する
Jenkinsの仕事を再開する
あなたは再びそのエラーメッセージを見るべきではありません:)
参考のために、他の誰かが同じ問題に遭遇した場合のために、私は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のバグではないかと思います)
私は私のケースで誰かを助けることができると思います。
まず、上記の回答を参考にして/etc/sudoers
のユーザー設定を変更しました。しかし、まだうまくいきませんでした。
myuser ALL=(ALL) NOPASSWD: ALL
%mygroup ALL=(ALL:ALL) ALL
私の場合、myuser
はmygroup
にありました。
そして私はグループを必要としませんでした。だから、その行を削除しました。
(私のようにその行を削除してはいけません。単にコメントを付けるだけです。)
myuser ALL=(ALL) NOPASSWD: ALL
できます!
このエラーは、シェルコマンド以外のスクリプト、たとえば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]。
ユーザーを単一の実行可能ファイル「systemctl」に限定し、visudoファイルの設定を誤っていたため、このエラーが発生しました。
これは私が持っていたものです:
jenkins ALL=NOPASSWD: systemctl
ただし、デフォルトでパスにある場合でも、実行可能ファイルへのフルパスを含める必要があります。次に例を示します。
jenkins ALL=NOPASSWD: /bin/systemctl
これにより、私のjenkinsユーザーはサービスを再起動できますが、フルルートアクセス権は持ちません。
この質問は古いですが、多かれ少なかれ私の最新のシステムに関連しています。 Sudoのデバッグモード(Debug Sudo /var/log/Sudo_debug all@info
の/etc/Sudo.conf
)を有効にした後、/ dev: "/dev is world writable
"をポイントしました。したがって、ttyファイルのアクセス権を確認する、特にtty/ptsノードが存在するディレクトリの権限が必要になる場合があります。
あるホストから別のホストに移行した場合、このエラーの原因となる可能性があることは誰にもわかりませんでした。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プログラムも指定されていない
多分何の答えもそれにマッチしなかったのかという疑問がはっきりしていませんが、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
これで、ユーザーに余計な権利を与えずにドライブをマウントできました。
NOPASSWDに基づかない他のオプション: