前言
在ansible的官方文檔中,提到了強烈推薦用ssh-agent來管理密鑰
究竟ssh-agent是什么,它有什么用法呢,下面來一探究竟。
ssh-agent是什么?用處是什么?
ssh-agent是什么?
ssh-agent是一個代理程序,它能幫助我們管理我們的私鑰。
ssh-agent在哪里用得到?
- 當我們的主機有多個密鑰對(例如:root用戶生成了一對公鑰私鑰對,hmk用戶生成了另外一對公鑰私鑰對),我們連接到其他不同的多台主機時,可能用的認證用戶不一樣,這時候需要我們手動指定使用哪個密鑰,一旦機器過多輸入會非常繁瑣,ssh-agent能幫我們管理這些密鑰對
- 當我們給私鑰加了密碼,而我們的認證方式又選擇了密鑰認證,ssh-agent可以幫助我們免去輸入密碼的繁瑣操作
ssh-agent的啟動
啟動ssh-agent有兩種命令:
ssh-agent $SHELL
eval `ssh-agent`
第一條命令:ssh-agent $SHELL
它會在當前的shell(筆者的shell為bash)中啟動一個子shell,ssh-agent程序運行在這個子shell中,在centos中,$SEHLL就是bash,所以這個命令可以寫為ssh-agent bash
,我們可以用pstree命令來查看進程樹驗證(找不到pstree命令可以用yum -y install psmisc
安裝)。
執行命令前:
執行命令后:
在當前會話中,我們已經進入到了子shell里了,ssh-agent也運行在這里,我們可以退出當前的子shell,ssh-agent會隨之消失。
第二條命令:
eval `ssh-agent`
它會直接開啟一個ssh-agent進程:
因為它是獨立進程,所以即使我們退出當前shell連接,它依然存在,所以,我們最好在退出前用命令ssh-agent k
關閉它。當然,這種方式同樣適用於第一種開啟了的ssh-agent程序。如果我們意外斷開了連接,再連接的時候用ssh-agent k
是無法關閉它的:
這個時候很簡單,用ps -ef|grep ssh-agent
找到對應的agent程序,用kill pid號
來殺死進程即可。
ssh-agent添加密鑰
使用前面的步驟開啟了ssh-agent后,可以用ssh-add /root/.ssh/id_rsa
命令添加密鑰了,注意:如果沒有開啟ssh-agent,你會看到這個報錯
此時需要用第一步的方法開啟ssh-agent
ssh-agent管理多個私鑰
首先,我們需要生成多對密鑰,方法可以參考我前面的博客[https://www.cnblogs.com/huangmengke/p/11497740.html],首先,生成一個非默認名字的私鑰:
然后用這個來做免密登錄到其他機器的認證:
然后,我們來“免密”登錄試試:
WTF???不是免密了嗎?這是因為ssh的密鑰認證默認使用/.ssh/id_rsa進行認證,如果你使用非默認的密鑰認證,需要手動指定你的私鑰文件,因為你發給172.16.101.251的公鑰和251問你的/.ssh/id_rsa不匹配,所以需要問你輸入密碼,正確的認證方式通過-i指定私鑰文件:
以上只是以一個私鑰舉例子,當我們需要連接N台主機,而且使用不同的密鑰來認證,每次需要手動指定私鑰,會極其繁瑣,這時ssh-agent就可以幫忙了~
ssh-agent避免輸入私鑰密碼
首先,設置ssh的私鑰/root/.ssh/id_rsa_hmk1 和私鑰密碼123456:
同樣的步驟做密鑰驗證,最后會提示我們輸入密鑰的密碼:
這樣的話,每次我們用密鑰認證登錄,都要求我們輸入密碼,非常的麻煩,ssh-agent可以幫助我們管理密鑰。在一個ssh會話中,只要輸入一次私鑰密碼,在同一ssh會話中之后再次使用到相同的私鑰時,可以不用再次輸入對應密碼,示例如下:
ssh-agent管理密鑰的其它命令
查看ssh-agent已經添加的私鑰:
ssh-add -l
示例:
查看ssh-agent已經添加的私鑰對應的公鑰:
ssh-add -L
示例:
刪除指定的私鑰
ssh-add -d 私鑰文件
示例:
刪除所有私鑰
ssh-add -D
類比總結
host1:二叔所在的公司
私鑰:我的私人財產-電腦
私鑰密碼:開機密碼
公鑰:我的個人名片
host2:胖虎公司(胖虎是筆者的朋友)
認證文件:收到二叔的名片,去geo找他,通過私鑰驗證身份
我copy公鑰--->全世界撒名片,這個我自己來,不讓管家胖虎干,畢竟刷臉
添加代理agent--->管家胖虎代為管理我的私人財產-電腦,和進入電腦的開機密碼;我有N台電腦和密碼,只給胖虎管一台或幾台,不滿意他的表現可以隨時不讓管家管理,不過這樣接洽外部會變得非常麻煩。
所以,ssh-agent,你學會了嗎?