私の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 -l
IDがない場合はコード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を使用する他のコマンドと同様に、単にプロキシを使用してリモート接続に必要なキーを取得します。