web-dev-qa-db-ja.com

純粋なbashでsshにパスワードを渡す

Bashスクリプトを使用してsshにパスワードを渡します(はい、使用できるsshキーがあることは知っていますが、これは意図したものではありません)。

expectを使用しているソリューションをいくつか見つけましたが、これは標準のbashツールではないため、パイプを使用してこれを実行できるかどうか疑問に思っています。

誰かが私に説明することができます、なぜ正確にこのようなもの:

echo "password\n" | ssh somehost.com

または

ssh somehost.com <(echo "password\n")

動作しませんか?動作させる可能性はありますか?おそらくsshを別のプロセスとして実行し、そのPIDを取得してから、文字列を直接送信しますか?

35
Liberat0r

私の質問に対する正確な答えがなかったので、他の機能するソリューションがあるときにコードが機能しない理由を調査し、見つけたものを投稿して主題を完成させることにしました。
それが判明したとして:

「sshは、直接TTYアクセスを使用して、インタラクティブキーボードユーザーによってパスワードが実際に発行されていることを確認します。」 sshpass manpage

これは、この場合パイプが機能しない理由、質問に答えます。明らかな解決策は、sshが通常の端末で実行されるように「考え」、単純なposix関数で実現できるため、単純なbashを超える条件を作成することでした提供しています。

36
Liberat0r

コマンドラインからパスワードを指定することはできませんが、sshキーを使用するか、John C.が提案するsshpassを使用するか、expectスクリプトを使用することができます。

Sshpassを使用するには、最初にインストールする必要があります。それから

sshpass -f <(printf '%s\n' your_password) ssh user@hostname

sshpass -p your_passwordを使用する代わりに。コメントでCharles Duffyで述べたように、コマンドラインからではなく、ファイルまたは変数からパスワードを提供する方が安全です。

ところで、<(command)構文の簡単な説明。シェルは括弧内のコマンドを実行し、すべてをファイル記述子で置き換えます。ファイル記述子はコマンドの標準出力に接続されます。この回答から詳細を見つけることができます https://unix.stackexchange.com/questions/156084/why-does-process-substitution-result-in-a-file-called-dev-fd-63-which -is-a-pipe

61
CS Pei