Linux シェル/bash コードでの sshpass の代替

Linux シェル/bash コードでの sshpass の代替

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 スクリプトを見つけました:

関連情報