Jenkins多SSH执行异常:仅完成首个SSH步骤后续未执行
问题分析与解决方案
核心问题原因
- 初始代码语法错误:第一个SSH块的结束标记写成了
<< EOF,属于无效的here-doc语法,导致shell解析失败,直接终止了整个sh脚本执行,后续的scp和第二个SSH步骤根本没运行。 - 修改后缩进引发的错误:ksh的here-doc默认要求结束标记
EOF必须完全顶格(不能有任何前导空格或缩进),你修改后的代码里EOF前面有缩进,ksh会把它当成普通命令文本,找不到正确的结束标记,因此抛出EOF: not found错误。
修复方案
方案1:移除结束标记的缩进(最稳妥)
将所有here-doc的结束标记EOF改成顶格书写,去掉前面的缩进,同时保证标记前后没有多余空格。修正后的代码如下:
stage('(02) Export file') { withCredentials([gitUsernamePassword(credentialsId: gitCredentials, gitToolName: 'Default')]) { sh ''' ssh user@env << EOF mkdir /alim1 || true; mkdir /alim2 || true; mkdir /alim3 || true; EOF scp script1.ksh user@env:/alim1 scp script2.ksh user@env:/alim2 scp script3.ksh user@env:/alim3 ssh user@env << EOF echo "Starting export" ksh /alim1/script1 || error1=1; ksh /alim2/script2 || error2=1; ksh /alim3/script3 || error3=1; EOF ''' } }
方案2:使用<<-EOF忽略制表符缩进(仅支持Tab)
如果希望保留代码的缩进美观,ksh支持<<-EOF语法,它会忽略结束标记前面的制表符(Tab)(注意必须是Tab,不能是空格)。修正后的代码示例:
stage('(02) Export file') { withCredentials([gitUsernamePassword(credentialsId: gitCredentials, gitToolName: 'Default')]) { sh ''' ssh user@env <<-EOF mkdir /alim1 || true; mkdir /alim2 || true; mkdir /alim3 || true; EOF scp script1.ksh user@env:/alim1 scp script2.ksh user@env:/alim2 scp script3.ksh user@env:/alim3 ssh user@env <<-EOF echo "Starting export" ksh /alim1/script1 || error1=1; ksh /alim2/script2 || error2=1; ksh /alim3/script3 || error3=1; EOF ''' } }
注意:这里
EOF前面的缩进必须是Tab键输入的制表符,不能用空格代替,否则ksh依然会识别不到结束标记。
额外建议:使用Jenkins SSH插件替代原生shell命令
对于Jenkins中的远程SSH操作,更推荐使用Publish Over SSH或SSH Agent插件,这些插件专门为Jenkins设计,能更可靠地处理远程连接、文件传输和命令执行,避免shell here-doc的语法陷阱,同时更容易管理凭据和错误处理。
内容的提问来源于stack exchange,提问作者Speed Remake
相关产品推荐
相关产品推荐

