在我的 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 中,这迫使我每次启动 shell 时输入密码或创建一个存储密码的期望文件,这两者都是我不想做的做。如何在启动 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
如果没有身份,则以代码 1 退出;如果无法连接到 ,则以代码 2 退出ssh-agent
。
然后添加所需密钥的密码。
ssh-add ~/path/to/keyfile
答案2
其想法ssh-agent
是让一个正在运行的服务存储您的所有密钥。因此,您只需输入密码一次,如果您想从远程主机登录第二台主机,您甚至可以将代理转发到远程主机。
首先验证是否ssh-agent
正在使用 运行ssh-add -l
,这可能表示“代理没有身份”。
ssh-add
其次,您可以通过说或向代理添加密钥ssh-add path/to/key/file
。
之后,rsync 与使用 ssh 的任何其他命令一样,将简单地使用代理来获取远程连接所需的密钥。