Jenkins Pipeline远程服务器切换用户目录并执行脚本问题求助
问题原因
每个sshCommand和sshScript都是独立的SSH会话,执行完毕后就会断开连接,前一个命令的用户切换、目录变更操作不会延续到下一个命令的会话中,这就是为什么单独执行切换用户、切换目录后,执行脚本时环境不生效。
解决方案
把需要连续执行的操作合并到同一个SSH会话里,以下是几种可行的实现方式:
方案1:单条命令串联所有操作
利用su -的-c参数传递后续命令,再用&&串联切换目录和执行脚本的操作,确保在同一个会话内完成所有步骤:
def remote = [:] remote.name = 'QA' remote.host = '193.401.200.001' remote.user = 'admin' remote.password = 'admin' remote.allowAnyHosts = true stage('Remote SSH') { sshCommand remote: remote, sh: "pbrun su - myuser -c 'cd /apps && ./demo.sh'" }
su - myuser -c '命令':切换到myuser用户后,执行单引号内的命令集合cd /apps && ./demo.sh:先切换到/apps目录,确认切换成功后再执行demo.sh,避免目录不存在时执行脚本出错
方案2:写入临时脚本批量执行
如果操作逻辑复杂,可先把所有步骤写入远程临时脚本,再切换用户执行:
def remote = [:] remote.name = 'QA' remote.host = '193.401.200.001' remote.user = 'admin' remote.password = 'admin' remote.allowAnyHosts = true stage('Remote SSH') { // 创建可执行的临时脚本 sshCommand remote: remote, sh: "echo -e 'cd /apps\n./demo.sh' > /tmp/run_demo.sh && chmod +x /tmp/run_demo.sh" // 切换用户执行脚本 sshCommand remote: remote, sh: "pbrun su - myuser -c '/tmp/run_demo.sh'" // 清理临时脚本(可选) sshCommand remote: remote, sh: "rm -f /tmp/run_demo.sh" }
方案3:结合sshScript调整执行逻辑
如果需要保留sshScript调用,需先确保脚本已上传到远程服务器,再切换用户指定目录执行:
def remote = [:] remote.name = 'QA' remote.host = '193.401.200.001' remote.user = 'admin' remote.password = 'admin' remote.allowAnyHosts = true stage('Remote SSH') { // 先将本地脚本上传到远程服务器(如果未提前部署) sshPut remote: remote, from: 'demo.sh', into: '/tmp/' // 切换用户并指定目录执行脚本 sshCommand remote: remote, sh: "pbrun su - myuser -c 'cd /apps && /tmp/demo.sh'" }
关键注意事项
- 绝对不要拆分独立的
sshCommand执行用户切换、目录变更,每个会话的环境是独立的,不会继承上一个会话的状态 - 使用
su - user而非su user,前者会加载目标用户的完整环境变量,避免脚本执行时因环境缺失出错 - 如果
pbrun有额外的认证或权限参数,需根据实际环境调整命令格式
内容的提问来源于stack exchange,提问作者Shivayan Mukherjee
相关产品推荐
相关产品推荐

