如何配置Jenkins在远程服务器执行Shell脚本时自动输入密码
Jenkins远程执行脚本自动输入密码的解决方案
方法1:用sshpass批量传递密码
- 先在Jenkins所在服务器安装sshpass:Debian/Ubuntu用
apt-get install sshpass,RHEL/CentOS用yum install sshpass - 直接用sshpass把密码传入远程执行流程,命令示例:
sshpass -p "你的密码" ssh 用户名@远程IP 'bash -s' < 本地部署脚本.sh - 安全优化:别明文写密码,把密码存Jenkins凭据里:
- 进入Jenkins「凭据管理」,添加「用户名和密码」类型凭据,设置ID比如
remote-deploy-cred - 在任务的「构建环境」中勾选「使用秘密文本或文件」,绑定该凭据,设置环境变量名比如
DEPLOY_CRED - 执行命令改成:
sshpass -p "${DEPLOY_CRED_PSW}" ssh ${DEPLOY_CRED_USR}@远程IP 'bash -s' < 本地部署脚本.sh - 进入Jenkins「凭据管理」,添加「用户名和密码」类型凭据,设置ID比如
方法2:用expect自动响应密码提示
- 编写expect脚本自动匹配密码请求,示例
auto-pass.exp:#!/usr/bin/expect set password [lindex $argv 0] spawn ssh 用户名@远程IP /path/to/你的部署脚本.sh expect { "*密码:" {send "$password\r"; exp_continue} "*Password:" {send "$password\r"; exp_continue} eof } - 给脚本添加执行权限:
chmod +x auto-pass.exp - 在Jenkins中调用时,结合凭据变量:
./auto-pass.exp "${DEPLOY_CRED_PSW}" - 这个方法能精准应对多次密码输入的场景,不管提示是中文还是英文。
方法3:配置sudo免密(需服务器管理员允许)
- 如果服务器管理员同意,修改
sudoers文件让你的用户免密执行指定命令:- 在远程服务器上执行
visudo - 添加一行:
你的用户名 ALL=(ALL) NOPASSWD: /path/to/脚本里的sudo命令1, /path/to/命令2 - 保存后,脚本里的sudo操作就不会再弹出密码提示
- 在远程服务器上执行
- 注意:只给必要的命令开免密,别贪方便给所有命令授权,避免安全风险。
方法4:用Jenkins SSH插件简化连接
- 安装Jenkins的「SSH plugin」插件
- 进入Jenkins「系统设置」,添加远程服务器的SSH凭据(用户名+密码)
- 在任务里选择「Execute shell script on remote host using ssh」,直接编写或调用部署脚本,插件会自动处理SSH连接的密码验证;如果脚本里有sudo需求,还是要结合上面的免密或expect方法。
内容的提问来源于stack exchange,提问作者sairohith naredla
相关产品推荐
相关产品推荐

