私はsshサーバーにログインして次のようなものを実行しようとしています:
ssh [email protected] 'Sudo echo "foobar"'
残念ながらエラーが発生しています:
Sudo: no tty present and no askpass program specified
グーグルは私に環境変数を設定するように言ったSSH_ASKPASS
またはaskpass
ファイルにsudoers
を設定します。私のリモートマシンはDebian 6で実行されており、パッケージssh-askpassおよびssh-askpass-gnomeをインストールしましたが、sudoers
ファイルは次のようになります:
Defaults env_reset
Defaults askpass=/usr/bin/ssh-askpass
# User privilege specification
root ALL=(ALL) ALL
user ALL=(ALL) ALL
誰かが私が間違っていることとそれをよりよくする方法を教えてもらえますか?.
このエラーメッセージを取り除く方法は2つあります。簡単な方法は、リモートのSudoプロセスに疑似端末を提供することです。オプション-t
でこれを行うことができます:
ssh -t [email protected] 'Sudo echo "foobar"'
TTYを割り当てたり、コマンドラインに表示されるパスワードを設定したりするのではなく、次のようにします。
次のようにパスワードをエコーするシェルファイルを作成します。
#!/bin/bash
echo "mypassword"
次に、次のようにscp
を使用して、必要なノードにそれをコピーします。
scp SudoPass.sh somesystem:~/bin
次に、ssh
を実行すると、次のようになります。
ssh somesystem "export Sudo_ASKPASS=~/bin/SudoPass.sh;Sudo -A command -parameter"
もう1つの方法は、Sudo -S
を実行して、「ターミナルデバイスを使用する代わりに、標準エラーにプロンプトを書き込み、標準入力からパスワードを読み取る」(man
による)とcat
:
cat | ssh [email protected] 'Sudo -S echo "foobar"'
プロンプトが表示されたら、パスワードを入力するだけです。
1つの利点は、「[Sudo] password for…」が含まれていないリモートコマンドの出力をファイルにリダイレクトできることです。
cat | ssh [email protected] 'Sudo -S tar c --one-file-system /' > backup.tar
Defaults askpass=/usr/bin/ssh-askpass
ssh-askpassはXサーバーを必要とするので、(nosidで提案されているように、-t
経由で)端末を提供する代わりに、-X
経由でX接続を転送できます。
ssh -X [email protected] 'Sudo echo "foobar"'
ただし、現在のドキュメントによると、askpass
はPath
ではなくsudoers
としてSudo.conf
に設定されています。
2013年12月編集:短い回答です:1日か2日でPython library " Fabric "に慣れてください。ファブリックは、リモートタスクを1つ以上のサーバーにディスパッチする。
パスワードなしのコマンドを実行できるターゲットシステムでユーザー名を設定する必要があるでしょう(Fabricを使用してそれを実行することもできます!)。
Fabricの一部の側面が完全にPython的ではないことに注意してください。また、Fabricは、サーバーに対してコマンドをバッチ処理することを望むシステム管理者を念頭に置いて最初に設計されました。他に何かをしようとしている場合(非常に特定のサーバーやシナリオを自動化するなど)、「設定を使用する」や@rolesデコレーターがどのように機能するかを完全に理解する必要があります。振り返っていない...
(そして、はい、「リモート」システムで動作するリモートSSHコマンドを取得しました。つまり、サーバーAはサーバーBにサーバーCに接続するように要求し、コマンドの戻りはサーバーAに直接通信しませんが、サーバーC.ラボのセットアップが簡単になります!)。
元の応答:この問題には多くの解決策があります。コース用の馬;状況によっては、他のものより優れているものもあります。
質問されるのは、「TTYなし」エラーを解決する方法です。それが焦点のようですので、sudoersについての話はTTYの問題を回避するための回避策の単なる試みであると思います。
オプション1)Askhatの答えはうまくいきます...ほとんどの場合。実際には、常により多くのターゲットシステムで機能する「-tt」を指定します。
「-t」を実行する直感的な方法がないParamikoのようなSSHライブラリを使用している場合でも、問題が発生することに注意してください。
オプション2)私の答え-STDINであるASKPASSを指定することです。したがって、この例は、Sudoパスワード要件とTTYの両方を満たしています。$ Shell> ssh [email protected] 'echo "password" | Sudo -S echo "foobar"'
オプション3)はい、すべてまたは一部のユーザーのSudoパスワードチェックを無効にできますが、本番サーバーではそれはクールではありません。
オプション4)リモート "requiretty"(またはsudoersのすべてまたは一部のユーザーに "!requiretty"を設定できます。ここでも、プロダクションボックスではクールではありません。
サーバーの変更は行わないことをお勧めします。いつかそのサーバーが置き換えられ、設定がデフォルトに戻り、スクリプトが機能しなくなります。
すべてのオプションを理解すると、自動化への扉が開かれることに注意してください(たとえば、ラップトップ上のスクリプトでは、サーバーのホスト名のリストに接続できず、コピーする必要なしにこれらのサーバーでSudoタスクを実行できます)それらのサーバーへのスクリプト)。