ssh-agent
にキーを追加しようとしています。ssh-add
を使用してファイルからパスワードを読み取ってください。どのように可能ですか?
シェルスクリプトからこのプロセスを自動化するにはどうすればよいですか?
ディストリビューションとssh-addのバージョンによっては、次のようにstdinからパスフレーズを読み取るssh-addの-p
オプションを使用できる場合と使用できない場合があります。
cat passfile | ssh-add -p keyfile
これが機能しない場合は、Unixツールの Expect を使用して、インタラクティブアプリケーションを非インタラクティブにすることができます。パッケージマネージャーからインストールする必要があります。
私はあなたのために道具を書きました。 ssh-add-passという名前のファイルにコンテンツをコピーし、実行権限を設定します(chmod +x ssh-add-pass
)。これを/ usr/binまたは/ usr/local/binにコピーして、$ PATH検索からアクセスすることもできます。
#!/bin/bash
if [ $# -ne 2 ] ; then
echo "Usage: ssh-add-pass keyfile passfile"
exit 1
fi
eval $(ssh-agent)
pass=$(cat $2)
expect << EOF
spawn ssh-add $1
expect "Enter passphrase"
send "$pass\r"
expect eof
EOF
使い方は簡単です:ssh-add-pass keyfile passfile
-p
をサポートしていないシステムの回避策を次に示します。
$ PASS="my_passphrase"
$ install -vm700 <(echo "echo $PASS") "$PWD/ps.sh"
$ cat id_rsa | SSH_ASKPASS="$PWD/ps.sh" ssh-add - && rm -v "$PWD/ps.sh"
ここで、ps.sh
は基本的に、パスフレーズを出力するスクリプトです。参照:man ssh-add
。
(同じファイルに保存しないように)安全性を高めるには、mktemp
を使用してランダムなプライベートファイルを生成し、実行可能にして(chmod
)、パスフレーズが標準に出力されるようにします。一度実行すると出力されます。
Kenorbの回答に似ていますが、シークレットをファイルに保存しません。
$ SSH_ASKPASS=/path/to/ssh_give_pass.sh ssh-add $KEYFILE <<< "$KEYPASS"
ここで、ssh_give_pass.shは次のとおりです。
#!/bin/bash
# Parameter $1 passed to the script is the Prompt text
# READ Secret from STDIN and echo it
read SECRET
echo $SECRET
$ KEYPASSFILEでシークレットを持っている場合は、最初にそれを変数に読み込みます。
KEYPASS=`cat $KEYPASSFILE`
また、権限のないユーザーがssh_give_pass.shを編集できないようにしてください。スクリプトで渡されたすべてのシークレットを簡単にログに記録できます。