背景:
jenkins 节点是centos8
openssh
ssh -V
OpenSSH_8.0p1, OpenSSL 1.1.1k FIPS 25 Mar 2021
jenkins 使用版本 Jenkins 2.338
使用的publish-over-ssh-plugin 版本是1.24(官网最新1.25)
新部署了一个Ubuntu22.04 虚拟机环境
sh -V
OpenSSH_8.9p1 Ubuntu-3ubuntu0.5, OpenSSL 3.0.2 15 Mar 2022
使用自由风格构建项目
以下是报错信息
13:59:44 打包完成! 下面开始分发jar包
13:59:44 SSH: Connecting from host [Asr-dev]
13:59:44 SSH: Connecting with configuration [branch-dev-node54] ...
13:59:45 SSH: EXEC: completed after 201 ms
13:59:45 SSH: Disconnecting configuration [branch-dev-node54] ...
13:59:45 ERROR: Exception when publishing, exception message [Exec exit status not zero. Status [1]]
13:59:45 Build step 'Send build artifacts over SSH' changed build result to UNSTABLE
另一边前端构建时的输出
13:20:18 {"errcode":0,"errmsg":"ok"}SSH: Connecting from host [Asr-dev]
13:20:18 SSH: Connecting with configuration [branch-dev-node54] ...
13:20:19 SSH: EXEC: completed after 201 ms
13:20:19 SSH: Disconnecting configuration [branch-dev-node54] ...
13:20:19 ERROR: Exception when publishing, exception message [Exec exit status not zero. Status [1]]
13:20:19 Build step 'Send files or execute commands over SSH' changed build result to UNSTABLE
排查原因,首先是查看目标节点node54 接收构建物的目录,发现有一个jar包文件。
同时也部署了一个前端构建项目,发现也是能够传到压缩包到目标文件夹下,但就是到该执行sh脚本完成后续部署,戛然而止了。
然后就是惯例 百度,AI大模型咨询,都没什么同样问题。
加上最近开始使用ubuntu22.04系统,发现它对权限各方面都严格些。
所以就想到看来是权限问题了。文件能够传输过去,但是不让jenkins运行Ubuntu上的sh脚本。
开始换搜索关键词,最后找到了 Ubuntu22.04 SSH失败的问题
解决办法
在Ubuntu 22.04系统上编辑/etc/ssh/sshd_config文件,文末添加如下
vim /etc/ssh/sshd_config
HostKeyAlgorithms +ssh-rsa
PubkeyAcceptedAlgorithms +ssh-rsa
重启下sshd服务。
然后jenkins再次构建,可以顺利完成发布。
附上文心一言对这2个配置的说明:
在SSH连接过程中,
HostKeyAlgorithms
和PubkeyAcceptedAlgorithms
这两个配置项定义了服务器和客户端如何验证对方的身份。增加ssh-rsa
到这些配置项的列表中,可能是因为在你的环境中,使用ssh-rsa
算法的密钥是被接受的,或者你的Jenkins节点只支持ssh-rsa
算法。以下是这两个配置项的解释:
- HostKeyAlgorithms:这个配置项定义了服务器接受的主机密钥算法的列表。默认情况下,新版本的SSH可能只接受基于ECDSA(Elliptic Curve Digital Signature Algorithm)的密钥,而不是RSA。但是,一些旧版本的客户端或特定的安全策略可能只接受RSA密钥。
- PubkeyAcceptedAlgorithms:这个配置项定义了客户端可以接受的主机公钥算法的列表。如果你的服务器使用的是RSA密钥,但你的客户端只接受ECDSA密钥,那么连接将会失败。
增加
ssh-rsa
到这些列表中,可能是为了解决兼容性问题。这确保了无论客户端支持哪种算法,都可以与服务器建立连接。不过,值得注意的是,增加
ssh-rsa
可能会降低连接的安全性,因为RSA密钥的长度通常较短(例如2048位),而ECDSA密钥的长度通常更长(例如4096位)。因此,如果你决定使用RSA,确保你的密钥长度足够长以提供足够的安全性。
后续,暂不采用升级jenkins节点的ssh版本来解决,因为那意味着我还要再改动更多其他节点上的配置,并且也减少其他异常问题的出现。
越做越错,少做少错,不做不错