在驗證jenkins中ssh登錄時,如果驗證失敗,首先應該嘗試直接通過ssh命令能否連接成功。
#在配置了公鑰私鑰的情況下執行: #ssh -p 你的端口號(很可能不是22) 用戶名(一般為root最大權限)@你的ip地址 #比如我的 ssh -p 51000 root@192.168.110.119
網上大多數推薦的復制公鑰到目標服務器方式為ssh-copy-id,但該命令要求輸入目標服務器密碼,有時候我們並不能拿到目標服務器的密碼,比如我司的服務器全部遷移到堡壘機上,那我們是沒有root密碼的,所以無法通過ssh-copy-id命令操作,只好手動復制粘貼到目標服務器的authorized_keys文件。如果發現自己在jenkins容器上生成了秘鑰,並將公鑰復制粘貼到了要連接的服務器上,但通過ssh直連測試發現仍然提示需要輸入密碼,那有兩種可能:
1、說明復制粘貼的公鑰不正確,最大的可能就是直接從控制台復制粘貼的公鑰有換行符!!!需要手動刪掉換行符才行。
2、.ssh文件夾及其內部文件訪問權限不夠。
這個時候可以在遠程服務器通過 journalctl --unit=sshd查看日志,然后按shift+G鍵切換到最新日志節點,如果含有錯誤:Authentication refused: bad ownership or modes for file /root/.ssh/authorized_keys,說明配置權限不對,這個配置權限不僅是遠程服務器的,本地的文件也要設置。
本來我以為給該文件夾及其文件設置最大權限(777)就行了,結果發現不行,該文件夾很特殊,必須設置700權限才行。

最終設置權限如下成功:
# 先ll查看下對應文件是否是對應權限; ls -l chmod 700 /root/.ssh chmod 700 /root/.ssh/id_rsa chmod 700 /root/.ssh/id_rsa.pub chmod 600 authorized_keys ls -l
記住一定是本地和遠程服務器都配置該權限哦。
如果直連能成功,再查找別的原因。
以下錯誤為對應秘鑰格式不被識別:
jenkins.plugins.publish_over.BapPublisherException: Failed to add SSH key. Message [invalid privatekey: [B@2fff36d6]
一種可能是你配置到jenkins里的私鑰沒有攜帶起止標志-----BEGIN RSA PRIVATE KEY-----或-----END RSA PRIVATE KEY-----,這兩個是要帶着的。
如果你是最新版本的docker鏡像安裝的jenkins容器,那么原因可能是容器內ssh版本太高,生成的私鑰格式不被老版本ssh認可。解決方案是手動生成舊格式的秘鑰:https://www.cnblogs.com/architectforest/p/13707244.html
ssh-keygen -m PEM -t rsa -b 2048 -m 參數指定密鑰的格式,PEM是rsa之前使用的舊格式 -b 指定密鑰長度。對於RSA密鑰,最小要求768位,默認是2048位。
比如我用的docker鏡像安裝的jenkins(截止2022.02.12版本),jenkins容器內ssh版本為:OpenSSH_8.4p1 Debian-5, OpenSSL 1.1.1k 25 Mar 2021,而jenkins安裝的ssh publish over插件截止2022.03.03最新版本1.24,雖然不知道它對應的ssh版本,但很明顯它確實不兼容最新版的ssh。
以下錯誤為對應秘鑰驗證失敗(對應公鑰不存在或不正確):
jenkins.plugins.publish_over.BapPublisherException: Failed to connect and initialize SSH connection. Message: [Failed to connect session for config [10.10.201.199]. Message [Auth fail]]
檢查配置的公鑰是否正確,一般不是私鑰的問題。
一般這兩個問題解決就可以連接成功了。
