私は次のコマンドを試しています:
ssh -A user@server 'bash -s' < mylocalscript.sh
しかし、スクリプトがSudo
に到達すると、迷惑なSudo: no tty present and no askpass program specified
を取得します。 man ssh
によれば、-A
はローカル認証を転送することになっているため、リモートサーバーでSudo
を使用できるはずです。
私は何を間違っている/理解していないのですか?
SSH認証とSudo認証は、2つの異なる資格情報のセットです。 ssh
コマンドの-A
オプションは、SSHにのみ適用されます。ローカルSSHキーを使用してserver
から別のシステムにsshできるように、資格情報を転送する機能を提供します。
パスワードなしでコマンドを実行できるSudoルールがない限り、シェルの端末から、または設定されている場合はaskpassプログラムを使用して、パスワードを常に入力する必要があります。 askpassプログラムは、パスワードの入力を安全に求めるだけの(通常はグラフィカルな)ヘルパープログラムです。リモートでSudoで認証するには、要求している2つのことのいずれかを行う必要があります。
Sudoがサーバー上のパスワードを安全に入力できるように、ttyがあることを確認してください。これは、ssh -t
でログインするのと同じくらい簡単です。
Sudo
で-A
オプションを指定したaskpassプログラムを使用して、パスワードを要求するようにSudoに指示します(ssh
!の-A
オプションと混同しないでください)。これは、たとえば次のようなスクリプトを使用して実行できます。
export Sudo_ASKPASS=/usr/lib/openssh/gnome-ssh-askpass
Sudo -A ...
シェルスクリプトをSSH接続の標準入力ストリームにパイプしているため、Sudo
はパスワードの入力を安全に要求できないことに注意してください。スクリプトをサーバーにコピーするだけでなく、このようなSSH標準入力を介してスクリプトを送信することが要件である場合、最初のオプションは機能しません。 askpassヘルパープログラムを使用するか、必要なSudo
ルールを設定して、NOPASSWD
を使用する必要があります(オプションの場合)。
-Aが須藤を助けるというあなたの前提は、残念ながら間違っています。単にssh-agentを転送するだけです。警告が示すように、askpassを実行する必要があります。
また、bash -c
は必要ないことに注意してください。 ssh server < mylocalscript.sh
を使用して、スクリプト内で単純なパイプを実行できます