Jenkins SSH shell在执行远程命令之前关闭

5

我有一个 Jenkins 工作任务,其中 "Execute shell" 下有以下命令:

ssh jenkins@172.31.12.58
pwd

我希望Jenkins服务器能够通过SSH连接到远程服务器,并在远程服务器上运行命令。

但实际上,Jenkins只是连接到了远程服务器,然后立即断开连接,在本地运行pwd命令,如下面的输出所示:

Started by user Johanan Lieberman
Building in workspace /var/lib/jenkins/jobs/Test Github build/workspace
[workspace] $ /bin/sh -xe /tmp/hudson266272646442487328.sh
+ ssh jenkins@172.31.12.58
Pseudo-terminal will not be allocated because stdin is not a terminal.
+ pwd
/var/lib/jenkins/jobs/Test Github build/workspace
Finished: SUCCESS

编辑: 你知道为什么在ssh命令之后的其他命令没有在SSH shell中运行,而是在本地运行吗?


潜在的重复问题:[什么是Bash中SSH和运行多个命令的最干净的方法?] (https://dev59.com/z2855IYBdhLWcg3wUSgW) - Dave Bacher
2个回答

8
如果您没有交互式运行,SSH 就不会创建交互式会话(因此您看到“伪终端”错误消息),因此它与在交互式终端中执行一系列命令并不完全相同。
要通过 SSH 会话运行特定命令,请使用:
ssh jenkins@YOUR_IP 'uname -a'

远程命令必须正确引用为ssh命令的单个参数。或者使用bash here-doc语法编写简单的多行脚本:
ssh jenkins@YOUR_IP <<EOF
pwd
uname -a
EOF

谢谢 @Dave,这就是我在寻找的解释。 - Johannes Liebermann
在远程 shell 命令的末尾添加 EOF 会导致出现 -bash: line 2: EOF: command not found 的错误。删除该行后,一切正常运行。 - QkiZ

1
我认为你可以使用Publish Over SSH plugin插件在通过SSH连接的从机上执行命令:

enter image description here

如果“源文件”字段是必填项,你可以传输一个虚拟文件。
更新: 另一种解决方案是使用SSH插件。与其他插件相比,这可能是更好的解决方案 :)

这是一个不错的解决办法,但我想知道为什么我不能使用“执行 shell”选项来实现它。我知道它也应该可以这样工作。 - Johannes Liebermann
你看过这个插件吗?https://wiki.jenkins-ci.org/display/JENKINS/SSH+plugin - Bruno Lavit
不,我的观点是要理解为什么我不能像我在原始帖子中描述的那样打开一个SSH shell,然后在其中运行命令。但是我已经使用您的第一个插件成功地让它工作了。 - Johannes Liebermann
好的,如果第一个插件可以工作,不要忘记验证我的解决方案 ;) - Bruno Lavit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接