web-dev-qa-db-ja.com

ttyが存在せず、 `ssh -A`で指定されたaskpassプログラムがありません

私は次のコマンドを試しています:

ssh -A user@server 'bash -s' < mylocalscript.sh

しかし、スクリプトがSudoに到達すると、迷惑なSudo: no tty present and no askpass program specifiedを取得します。 man sshによれば、-Aはローカル認証を転送することになっているため、リモートサーバーでSudoを使用できるはずです。

私は何を間違っている/理解していないのですか?

2
knownasilya

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を使用する必要があります(オプションの場合)。

2
Mike Miller

-Aが須藤を助けるというあなたの前提は、残念ながら間違っています。単にssh-agentを転送するだけです。警告が示すように、askpassを実行する必要があります。

また、bash -cは必要ないことに注意してください。 ssh server < mylocalscript.shを使用して、スクリプト内で単純なパイプを実行できます

1
wernerb