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
などは、ptyのマスター側にパスワードを書き込む前に書き込みプロンプトをexpect
待ってこの問題を処理します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スクリプトを見つけました。