最近用docker新搭建了一個jenkins,安裝插件的時候發現publish over ssh找不到了,官方給出的解釋是存在安全隱患於2022.01.12暫停分發,官方解釋如下:https://www.jenkins.io/security/advisory/2022-01-12
之前文章介紹過通過publish over ssh插件推送jenkins編譯好的項目到對應服務器,現在該插件無法使用了,只能尋找替代插件。
在程序猿bug解決聖地找到一篇咨詢該問題的解決方案:https://stackoverflow.com/questions/70828203/which-plugins-could-replace-publish-over-ssh-from-jenkins,使用ssh插件(未安裝之前在可選插件里叫ssh,安裝之后在已安裝里叫ssh plugin),不過該插件上一次版本更新也已經是3年前10個月了(截止2022.02.12)。

查找資料學習ssh插件的用法。。。。。。
搜索關鍵字jenkins ssh,你查到的99.999%資料都是關於publish over ssh的,垃圾。。。
於是搜索This plugin executes shell commands remotely using SSH protocol,找到一篇完整介紹通過ssh方式配置的文章:https://blog.51cto.com/wujianwei/2492430
一、安裝ssh插件,如上圖。
二、配置遠程ssh連接服務器的賬號密碼憑據。(這里我們以root賬號講解,關於非root賬號(或者說非最大權限的賬號)我們后面單獨介紹。)
Manage Jenkins(系統管理) —>Manage Credentials --> Stores scoped to Jenkins 下的權限域 --> 全局憑據 --> 點擊左側添加憑據按鈕 --> 選擇類型(Username with password 或者 SSH Username with private key)--> 填寫賬號密碼(或private key)后確認添加。

三、配置SSH服務器參數。
Manage Jenkins(系統管理) —>System Configuration(系統配置) --> SSH remote hosts --> 點擊SSH sites下的新增按鈕 --> 填寫以下信息 --> 填寫完后點擊底部的保存(或應用)。

hostname:要ssh連接的服務器ip;
port:服務器端口;
Credentials:選擇連接的賬號;
下面的可以暫時不填,表示用默認值。
點擊按鈕Check connection,驗證配置的以上參數是否正確。
四、構建應用。
關於創建新任務本文就不介紹了,前面文章有介紹過,網上文章也不少。本次我們只說新增加的ssh方式。
在構建選項下增加構建步驟:Execute shell script on remote host using ssh
填寫ssh連接的遠程服務器,和連接后的shell執行語句。我這里是連接到宿主機,然后把宿主機掛載的tomcat容器項目清理再重新從jenkins容器掛載的編譯文件夾中復制新的。

保存后執行即可成功~~
以上配置是假設你知道服務器root賬號(或其他類似root權限賬號)的基礎上,,很多時候IT給我們的機器是通過堡壘機(即服務器管理系統)登錄的,雖然登錄的是root賬號但是不給到root賬號密碼,這個時候可能需要我們自己創建賬號,然后配置對應的參數到jenkins系統管理的ssh中。
關於在centos中創建賬號,可以參考這篇文章:https://www.cnblogs.com/geoffreygao/p/12238231.html
一、添加新賬號:
useradd 你的新賬號;
#例如添加賬戶王小明:useradd wangxiaoming
二、添加密碼:
passwd 你上面創建的新賬號; # 例如:passwd wangxiaoming
此時會讓你輸入密碼,輸入密碼時不顯示任何字符,不要以為卡住了,不要按刪除鍵del,密碼輸好后按確認鍵enter,如果密碼太簡單安全性較低會提示你,不用管,繼續就好,會讓你再輸入一遍密碼確認。
三、設置權限:
此時的新賬號只有查看權限, 如果你想復制(cp)文件、移動文件(mv)、刪除文件(rm)都是沒有權限的。
#切換賬號,有的文章介紹中su后面加-,發現在centos中會有不正確提示,不需要加就能切換。 su wangxiaoming #執行復制文件。非root賬號前需要加sudo關鍵字。 sudo cp favicon.ico favicon.ico3
#提示輸入密碼驗證后才能操作,此時輸入密碼提示沒有再sudoers文件中存在權限。
根據前面參考文章介紹要在/etc/sudoers中添加權限,而本身該文件是沒有寫入權限的,需要先修改該文件為可寫入權限。而修改sudoers文件需要root賬號操作。
# 注意要切換回root賬號,因為我在堡壘機上沒有root賬號密碼,所以是重新開啟新shell窗口以root賬號操作。
# 為sudoers添加可寫權限 chomd -v u+w /etc/sudoers
# 編輯sudoers文件 vi /etc/sudoers 按Insert鍵進入編輯模式 # 在 sudoers 文件添加新用戶信息到 ## Allow root to run any commands anywhere 下,修改后的效果為: ## Allow root to run any commands anywher root ALL=(ALL) ALL wangxiaoming ALL=(ALL) ALL
按Esc 后 輸入 :wq 保存並退出
此時再執行sudo cp favicon.ico favicon.ico3,輸入密碼后復制文件成功。

還有一種方式是將普通賬號放入wheel用戶組中(usermod -G wheel wangxiaoming),但這種方式不適合在jenkins中使用,因為下面我們要去掉驗證密碼,假如用戶組中的話需要將整個wheel組去掉密碼驗證,得不償失,放棄此方式。
四、去掉密碼驗證。
上面我們發現執行sudo cp語句后需要輸入密碼驗證,但我們本意是要在jenkins中執行的,而jenkins中自動執行的過程中是無法輸入密碼的,所以會導致構建失敗(大家可以去試下)。
那么我們是否可以設為不用輸入密碼就執行呢,答案是可以的。方法還是修改上面的sudoers文件,只不過最后的ALL變為NOPASSWD: ALL即可。
# 注意要切換回root賬號,因為我在堡壘機上沒有root賬號密碼,所以是重新開啟新shell窗口以root賬號操作。
# 編輯sudoers文件 vi /etc/sudoers 按Insert鍵進入編輯模式 # 在 sudoers 文件添加新用戶信息到 ## Allow root to run any commands anywhere 下,修改后的效果為: ## Allow root to run any commands anywher root ALL=(ALL) ALL wangxiaoming ALL=(ALL) NOPASSWD: ALL 按Esc 后 輸入 :wq 保存並退出
再執行sudo cp語句發現不需要輸入密碼驗證了。
五、修改sudoers文件回不可寫入模式。
前面我們將sudoers文件設為了可寫入模式,此時記得重新將其權限設為不可寫入哦,當然要用root賬號操作~~
# 注意要切換回root賬號,因為我在堡壘機上沒有root賬號密碼,所以是重新開啟新shell窗口以root賬號操作。 #取消 sudoers 文件可寫權限 chmod -v u-w /etc/sudoers
這樣在jenkins中用非root賬號執行shell便不需要再輸入賬號密碼了。
最后,雖然本次方式暫時解決了沒有publish over ssh的問題,但目前該方式僅適合兩種情況:
1、ssh連接到遠程服務器后在遠程服務器執行構建操作,或在遠程服務器直接獲取已構建好的項目。
2、使用docker容器模式,而且jenkins容器和對應的服務器容器(比如tomcat)在同一個宿主機上,這樣可以通過ssh連接到宿主機進行文件夾之間的增刪移動復制操作。
我這次情況是2。
其他的情況可能不適用本文方式。
今天大佬給了一個新思路,說將兩個服務器添加互信,然后不用插件方式,有私鑰公鑰后直接shell執行ssh登錄。下一次我將用這種方式學習並記錄一下。
