
sshpass
これらは、ファイルから、または引数としてパスワードを読み取るための標準コマンドです。
user@linux:~$ sshpass -f pwd.txt ssh admin@server
admin@server:~$
user@linux:~$ sshpass -p P@55 ssh admin@server
admin@server:~$
expect
利用できない場合は、シェルで同じプログラム/スクリプトを記述することは可能ですか?
Public/private
この場合、キーはオプションではありません。
同じ機能を提供するコードが利用可能であればsshpass
、お知らせください。
コードはシンプルであればあるほど良いです。
答え1
script(1)
任意のタイムアウトを調整できるのであれば、ミニエクスペクトとして、もちろんかなり不格好ではありますが、次のようにすることができます。
{ sleep 1; echo PASSWD; } | script -q /dev/null -c 'ssh user@host CMD'
またはBSDの構文でscript(1)
:
{ sleep 1; echo PASSWD; } | script -q /dev/null ssh user@host CMD
はパスワードを読む前にttyの入力バッファを空にする(そしてそこに既に書き込まれているものはすべて破棄する)sleep
ために必要です。リモートサーバーがssh
時々応答が遅い場合、「十分に大きい」タイムアウトを使用することは実用的ではない可能性があります。
sshpass
などでは、プロンプトの書き込みをexpect
待ってから pty のマスター エンドにパスワードを書き込むことでこれを処理します。標準シェルからこれを実行するのは、単純でも堅牢でもありません。以下は、名前付きパイプを使用した間に合わせの方法です。ssh
... password:
passwdcmd(){
t=$(mktemp -u); mkfifo "$t" || return
script /dev/null -qc "$2" <>"$t" | { dd count=1 2>/dev/null; echo "$1" >"$t"; rm "$t"; cat; }
}
passwdcmd PASSWD 'ssh user@host CMD'
もちろん、これはあまり安全ではありません。特にecho
シェルに組み込まれていない可能性があるためです。sshの非対話型の使用については、公開鍵認証を使用する。
答え2
純粋な bash で sshpass を実装する素晴らしい bash スクリプトを見つけました: