サーバー A からサーバー B にいくつかのファイルをデプロイする必要があります。サーバー A に SSH 経由で接続し、そこから ssh 経由でサーバー B に接続します。サーバー A に保存されている秘密鍵と、サーバー B にある公開鍵を使用します。 authorized_keys ファイル。A から B への接続は、サーバー A にある Bash シェル スクリプト内で行われます。
セキュリティ意識の高い管理者が、サーバー A に保存されている私の SSH 秘密鍵はパスフレーズで保護されていないことを指摘するまで、これはすべて正常に機能し、シンプルでうまく機能します。 B、そして C、D、E、F、G. 彼には一理あると思います。
彼は、パスフレーズを追加し、シェル スクリプトを変更して、呼び出しの先頭に aa 行を追加するという複雑なシナリオを提案しています。
ssh-keygen -p -f {private key file}
古いパスフレーズのプロンプトにパスフレーズを入力し、新しいパスフレーズの (2 つの) プロンプトにパスフレーズを削除する return だけで応答し、最後に scp コマンドを呼び出した後に応答します。
ssh-keygen -p -f {private key file}
もう一度、パスフレーズを元に戻します
私は「うん!」と言います。
最初にスクリプト内のパスフレーズ ONCE を次のように読み取ることで、それを少し改善できます。
read -s PASS_PHRASE
次に、ssh-keygen の -N および -P パラメーターを使用して、必要に応じてそれを提供します。
ほとんど使えますが、私はシェル スクリプトのインタラクティブなプロンプトが嫌いです。これを 1 つのインタラクティブなプロンプトにまとめたいのですが、パスフレーズを取り除くために Enter キーを 2 回押さなければならない部分が致命的です
これはコマンドラインから機能します:
ssh-keygen -p -f {private key file} -P {pass phrase} -N ''
シェルスクリプトからではありません。そこでは、-N パラメータを削除し、2 つのリターンを入力する必要があることを受け入れる必要があるようです。
それが私にできる最善のことです。誰でもこれを改善できますか?または、これを処理するより良い方法はありますか? ないなんて信じられない。
パスフレーズを入力することなくこれを安全に処理する方法が最善ですが、それはあまりにも多くのことを求めている可能性があります. スクリプトの呼び出しごとに 1 回で解決します。
これは、スケルトン形式のスクリプト全体の簡略化されたバージョンです
#! /bin/sh
KEYFILE=$HOME/.ssh/id_dsa
PASSPHRASE=''
unset_passphrase() {
# params
# oldpassword keyfile
echo "unset_key_password()"
cmd="ssh-keygen -p -P $1 -N '' -f $2"
echo "$cmd"
$cmd
echo
}
reset_passphrase() {
# params
# oldpassword keyfile
echo "reset_key_password()"
cmd="ssh-keygen -p -N '$1' -f $2"
echo "$cmd"
$cmd
echo
}
echo "Enter passphrase:"
read -s PASSPHRASE
unset_passphrase $PASSPHRASE $KEYFILE
# do something with ssh
reset_passphrase $PASSPHRASE $KEYFILE