1.ssh的登錄方式
1.1 密碼口令
- 客戶端連接上服務器之后,服務器把自己的公鑰傳給客戶端
- 客戶端輸入服務器密碼通過公鑰加密之后傳給服務器
- 服務器根據自己的私鑰解密登錄密碼,如果正確那么就讓客戶端登錄
1.2 公鑰認證
這個其實比上面的要簡單,之前上大學時老師也講過。一定要明白客戶端和服務端時通過公鑰和私鑰實現認證登錄的。一定要牢牢記住就是只靠這兩個東西,沒有其他的了。
拿自動化部署舉例,Rundeck部署在一台服務器上現在要對其他的一台或者多台部署服務器進行項目部署,在這個場景下Rundeck對應的服務器要想去訪問其他的部署服務器就要通過公私鑰的這種方式。
Rundeck服務器相當於A端,而部署服務器相當於B端。A、B兩端要實現交互認證就要通過一組公私鑰。
1、客戶端即A端生成RSA公鑰和私鑰:
一般在用戶的根目錄新建一個.ssh/.文件夾,在文件夾中通過ssh-keygen -t rsa命令來產生一組公私鑰。
如下圖所示id_rsa為私鑰,id_rsa.pub為公鑰。
2、客戶端將自己的公鑰存放到服務器:在生成了公私鑰之后要實現AB兩端的交互認證,這兩個文件肯定不能只放到A端,當然也需要在B端(服務器端)做一下登記,我們自己(A端)保留自己的私鑰,然后把公鑰id_rsa.pub存放到B端(一般是在用戶根目錄下的.ssh/目錄下)
在服務器端(B端)的.ssh/目錄下還會有authorized_keys+know_hosts,這兩個文件。
authorized_keys:存放遠程免密登錄的公鑰,主要通過這個文件記錄多台機器的公鑰,上面提到的A端在生成自己的公私鑰之后,將公鑰追加到authorized_keys文件后面。
紅色框起來的為新追加的A端的公鑰。
know_hosts : 已知的主機公鑰清單,這個作為A端和B端都會自動生成這個文件,每次和遠端的服務器進行一次免密碼ssh連接之后就會在這個文件的最后追加對方主機的信息(不重復)
每進行一次就會在這個文件中自動的追加新的主機信息
通過scp將內容寫到對方的文件中
命令:scp -p ~/.ssh/id_rsa.pub root@<remote_ip>:/root/.ssh/authorized_keys
也可以分解為一下兩步來進行:
$ scp ~/.ssh/id_rsa.pub root@<remote_ip>:pub_key //將文件拷貝至遠程服務器
$ cat ~/pub_key >>~/.ssh/authorized_keys //將內容追加到authorized_keys文件中, 不過要登錄遠程服務器來執行這條命令
網上很多都是用scp >>去追加,如果你可以登錄到B端的話其實直接復制過去就可以了。
需要注意的幾點:
設置文件和目錄權限(服務器端即B端的權限):
設置authorized_keys權限
$ chmod 600 authorized_keys
設置.ssh目錄權限
$ chmod 700 -R .ssh
到這里我們的配置工作就結束了!!!
進行連接認證:
ssh root@222.73.156.133 -p1019
如果嫌每次連接的時候很麻煩
我們可以利用 ssh 的用戶配置文件 config 管理 多個免密碼ssh 會話。ssh 的用戶配置文件是放在當前用戶根目錄下的 .ssh 文件夾里(~/.ssh/config,不存在則新創建一個),其配置寫法如下:
Host 別名
HostName 主機名
Port 端口
User 用戶名
IdentityFile 密鑰文件的路徑
如下圖實例:
配置完后我們就可以通過這種方式登錄了:
---------------------------------------------------------
兩台服務器交互驗證的細節如下:
3、客戶端請求連接服務器,服務器將一個隨機字符串發送給客戶端
4、客戶端根據自己的私鑰加密這個隨機字符串之后再發送給服務器
5、服務器接受到加密后的字符串之后用公鑰解密,如果正確就讓客戶端登錄,否則拒絕。這樣就不用使用密碼了。
2. 在查看進程的時候不要只看有沒有,還要留意進程啟動時間和啟動的位置
3.在進行Rundeck配置的時候要小心,不要復制粘貼的時候多了一個空格,不然會花費你好久去找問題!!!
4.Jenkins讀取不到環境變量可以用-ilex解決同樣也可以,在腳本中給變量賦值。