スクリプトの実行中にSSHキーパスワードのプロンプトを呼び出すにはどうすればよいですか?

スクリプトの実行中にSSHキーパスワードのプロンプトを呼び出すにはどうすればよいですか?

私のssh_configファイルには、同じサーバー上のサイトの複数のエントリがあります。たとえば、次のようになります。

Host site1
     HostName 123.1.1.1
     User myuser
     Port 13245
     GSSAPIAuthentication no
     IdentityFile /home/myuser/.ssh/id_dsa

Host site2...

パスワードで保護されたキーを使用してリモートサーバーにログインしましたが、うまくいきます。しかし、rsyncを使用してファイルを同期するいくつかのbashスクリプトを作成しようとしています。スクリプトでパスワードの入力を求められ、rsyncコマンドを実行したいと思います。私はssh-agentを使いたいと思っていますが、それを見つけるのに苦労しています。似たようなものを探しています...

HOST="site1:"
SRC=/var/foo
DEST=/home/bar
SYNC=(rsync "$SRC" "$HOST""$DEST"...)# rsync /var/foo site1:/home/bar...

read -r -p "Are you sure? [y/N] " response
response=${response,,}
if [[ $response =~ ^(yes|y)$ ]]
then
    #check to see if the passphrase exists from prior execution of this script.
    if [ no ];then
        #use ssh-add to prompt for passphrase
        ssh-add #? ;
        #then execute rsync command
        "${SYNC[@]}"
    else
        #execute rsync command
        "${SYNC[@]}"
    fi
else
    echo "Operation aborted!"
fi

私が見つけることができる唯一の例は、.bashrcまたは.profileにコードを配置することでした。この場合、シェルを起動するたびにパスワードを入力するか、パスワードを保存するための予想ファイルを生成する必要がありますが、どちらも望ましくありません。する。私の例に示すように、ホストを切り替えてスクリプトを再実行できるようにrsyncスクリプトを起動したときにパスワードを一度だけ尋ねるメッセージを表示するにはどうすればよいですか?

答え1

ssh-agent最初に実行していることを確認し、それ以外の場合は起動できます。

if ! [ -n "$SSH_AUTH_SOCK" ] || 
  ! { ssh-add -l &>/dev/null; rc=$?; [ "$rc" -eq 0 ] || [ "$rc" -eq 1 ];}; then
    echo "Starting agent..."
    eval "$(ssh-agent -s)"
fi

ssh-add -lIDがない場合はコード1で終了し、接続できない場合はコード2で終了しますssh-agent

次に、必要なキーのパスワードを追加します。

ssh-add ~/path/to/keyfile

答え2

アイデアssh-agentは、すべてのキーを保存する実行中のサービスを持つことです。したがって、パスワードを一度入力するだけで、リモートホストから2番目のホストにログインしたい場合は、エージェントをリモートホストに転送することもできます。

まず、ssh-agentを使用して実行していることを確認してくださいssh-add -l。これは、「エージェントにIDがない」を意味する可能性があります。

ssh-add次に、またはと言ってエージェントにキーを追加できますssh-add path/to/key/file

その後、rsyncはsshを使用する他のコマンドと同様に、単にプロキシを使用してリモート接続に必要なキーを取得します。

関連情報