带密码的RSA密钥如何在BASH脚本中执行SSH命令?
我来帮你搞定这个带密码RSA密钥通过Bash脚本执行SSH命令的问题~
先说说你当前的问题出在哪
你用sshpass配合ssh -i的方式根本不对!sshpass只能用来传递「用户名密码登录」的密码,完全没法处理带密码的RSA私钥解锁。所以你的脚本才会挂起无输出——SSH一直在等你手动输入私钥的密码,而sshpass压根没管这个环节。
正确的姿势:用ssh-agent临时托管解锁后的私钥
既然因为合规要求必须保留私钥密码,那最安全可靠的方式就是借助ssh-agent来临时加载解锁后的私钥,具体步骤如下:
1. 先启动ssh-agent
在脚本开头先启动后台运行的ssh-agent服务,它会帮你管理解锁后的密钥:
eval $(ssh-agent -s)
2. 用sshpass配合ssh-add解锁私钥
ssh-add可以从标准输入读取私钥密码,刚好可以用sshpass -e读取你存在环境变量$SSHPASS里的密码,自动解锁并加载私钥:
sshpass -e ssh-add ./deploy_key
(注意:一定要先把私钥文件权限改成600,不然SSH会拒绝使用,脚本里可以加一句chmod 600 ./deploy_key)
3. 执行远程SSH命令
现在私钥已经被ssh-agent托管了,直接执行SSH命令就行,不需要再指定-i参数:
ssh root@132.62.16.142 "pwd"
如果是第一次连接远程服务器,SSH会提示确认主机指纹,这也会导致脚本挂起,可以加个参数自动跳过:
ssh -o StrictHostKeyChecking=no root@132.62.16.142 "pwd"
(安全提示:这个参数会跳过主机指纹验证,高安全场景下建议提前把远程主机指纹加入~/.ssh/known_hosts)
完整脚本示例
#!/bin/bash # 启动ssh-agent后台服务 eval $(ssh-agent -s) # 设置私钥文件权限(必须是600) chmod 600 ./deploy_key # 自动解锁并加载私钥到ssh-agent sshpass -e ssh-add ./deploy_key # 执行远程命令(这里是打印工作目录) ssh -o StrictHostKeyChecking=no root@132.62.16.142 "pwd" # 可选:清理ssh-agent环境 ssh-agent -k
额外提醒
要确保Travis环境里安装了sshpass和openssh-client,如果没有的话,可以在.travis.yml里添加安装步骤:
before_install: - sudo apt-get update - sudo apt-get install -y sshpass openssh-client
内容的提问来源于stack exchange,提问作者nelsonic
相关产品推荐
相关产品推荐

