如何在脚本执行期间调用输入 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 中,这迫使我每次启动 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 的任何其他命令一样,将简单地使用代理来获取远程连接所需的密钥。

相关内容