You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

带密码的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:01:11