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などは、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スクリプトを見つけました。

関連情報