Bashスクリプトを使用してssh
にパスワードを渡します(はい、使用できるsshキーがあることは知っていますが、これは意図したものではありません)。
expect
を使用しているソリューションをいくつか見つけましたが、これは標準のbashツールではないため、パイプを使用してこれを実行できるかどうか疑問に思っています。
誰かが私に説明することができます、なぜ正確にこのようなもの:
echo "password\n" | ssh somehost.com
または
ssh somehost.com <(echo "password\n")
動作しませんか?動作させる可能性はありますか?おそらくssh
を別のプロセスとして実行し、そのPIDを取得してから、文字列を直接送信しますか?
私の質問に対する正確な答えがなかったので、他の機能するソリューションがあるときにコードが機能しない理由を調査し、見つけたものを投稿して主題を完成させることにしました。
それが判明したとして:
「sshは、直接TTYアクセスを使用して、インタラクティブキーボードユーザーによってパスワードが実際に発行されていることを確認します。」 sshpass manpage
これは、この場合パイプが機能しない理由、質問に答えます。明らかな解決策は、ssh
が通常の端末で実行されるように「考え」、単純なposix
関数で実現できるため、単純なbash
を超える条件を作成することでした提供しています。
コマンドラインからパスワードを指定することはできませんが、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