ssh代理是一個(gè)程序,它可以幫助我們管理私鑰,ssh-agent即為ssh代理程序。
那么什么時(shí)候需要ssh代理幫助我們管理私鑰呢?當(dāng)遇到如下情況時(shí),我們會(huì)需要ssh代理。
1、使用不同的密鑰連接到不同的主機(jī)時(shí),需要手動(dòng)指定對(duì)應(yīng)的密鑰,ssh代理可以幫助我們選擇對(duì)應(yīng)的密鑰進(jìn)行認(rèn)證,不用手動(dòng)指定密鑰即可進(jìn)行連接。
2、當(dāng)私鑰設(shè)置了密碼,我們又需要頻繁的使用私鑰進(jìn)行認(rèn)證時(shí),ssh代理可以幫助我們免去重復(fù)的輸入密碼的操作。
上述兩種情況我們會(huì)一一道來,不過在描述它們之前,我們先來了解一下怎樣使用ssh代理。
啟動(dòng)ssh代理并添加密鑰
首先,如果想要使用ssh代理,我們則需要先啟動(dòng)ssh代理,也就是啟動(dòng)ssh-agent程序,如下兩條命令都可以啟動(dòng)代理,但是略有不同。
ssh-agent $SHELL
eval `ssh-agent`
如果你最小化安裝了centos,那么你執(zhí)行上述命令時(shí),可能會(huì)提示找不到ssh-agent命令,此時(shí)你需要安裝openssh-clients,安裝后即可使用上述命令。
當(dāng)我們使用”ssh-agent $SHELL”命令時(shí),會(huì)在當(dāng)前shell中啟動(dòng)一個(gè)默認(rèn)shell,作為當(dāng)前shell的子shell,ssh-agent程序會(huì)在子shell中運(yùn)行,當(dāng)執(zhí)行”ssh-agent $SHELL”命令后,我們也會(huì)自動(dòng)進(jìn)入到新創(chuàng)建的子shell中,centos中,默認(rèn)shell通常為bash,所以,在centos中上述命令通常可以直接寫為ssh-agent bash,當(dāng)然,如果你的默認(rèn)shell已經(jīng)指定為其他shell,比如csh,那么你也可以直接使用ssh-agent csh,效果都是相同的,我們來實(shí)驗(yàn)一下。
當(dāng)前使用的centos系統(tǒng)的默認(rèn)shell為bash,在未啟動(dòng)ssh-agent程序時(shí),我們?cè)诋?dāng)前bash中執(zhí)行pstree命令,查看sshd的進(jìn)程樹,如下

然后,執(zhí)行”ssh-agent $SHELL”命令(注意:SHELL為大寫),啟動(dòng)ssh代理,執(zhí)行此命令后,再次使用pstree命令,查看sshd的進(jìn)程樹

啟動(dòng)ssh代理后,查看sshd進(jìn)程樹,如下所示

在原來的bash中新生成了一個(gè)子bash,ssh-agnet運(yùn)行在子bash中,我們的命令也同樣在子bash中執(zhí)行。
此時(shí),在當(dāng)前會(huì)話中,我們已經(jīng)可以使用ssh-agent了,ssh-agent會(huì)隨著當(dāng)前ssh會(huì)話的消失而消失,這也是一種安全機(jī)制,比如,退出當(dāng)前子shell,再次查看進(jìn)程樹。

找到sshd的進(jìn)程樹,如下,如果你操作的非??欤赡軙?huì)在與sshd進(jìn)程平級(jí)的區(qū)域看到一個(gè)還沒有來得及關(guān)閉的ssh-agent進(jìn)程,但是最終sshd的進(jìn)程樹如下圖所示。

可以看到ssh-agent已經(jīng)不再存在了,如果你的服務(wù)器中開啟了圖形化環(huán)境,使用”ps -ef | grep ssh-agent”命令查找ssh-agent進(jìn)程,仍然能夠看到一個(gè)ssh-agent進(jìn)程,這個(gè)ssh-agent進(jìn)程是跟隨圖形化界面開機(jī)啟動(dòng)的,但是通常,服務(wù)器中很少會(huì)開啟圖形化界面,所以我們不用在意它。
雖然我們已經(jīng)知道了怎樣啟動(dòng)ssh-agent,但是,如果想讓ssh代理幫助我們管理密鑰,還需要將密鑰添加到ssh代理中,這個(gè)話題一會(huì)兒再聊。
剛才執(zhí)行了ssh-agent $SHELL命令,現(xiàn)在試試 eval `ssh-agent` 命令。
eval `ssh-agent`命令并不會(huì)啟動(dòng)一個(gè)子shell,而是會(huì)直接啟動(dòng)一個(gè)ssh-agent進(jìn)程,示例如下

找到進(jìn)程樹的如下部分

可以看到,ssh-agent進(jìn)程已經(jīng)啟動(dòng)了,此刻,如果我們推出當(dāng)前bash,此ssh-agnet進(jìn)程并不會(huì)自動(dòng)關(guān)閉,所以,我們應(yīng)該在退出當(dāng)前bash之前,手動(dòng)的關(guān)閉這個(gè)進(jìn)程,在當(dāng)前bash中,使用ssh-agent -k命令可以關(guān)閉對(duì)應(yīng)的ssh-agent進(jìn)程,但是,如果在退出了當(dāng)前bash以后再使用’ssh-agent -k’命令,是無法關(guān)閉對(duì)應(yīng)的ssh-agent進(jìn)程的,除非使用kill命令,當(dāng)然,其實(shí)在使用 ssh-agent $SHELL 命令時(shí),也可以使用’ssh-agent -k’命令關(guān)閉ssh代理。
好了,我們已經(jīng)了解了怎樣啟動(dòng)ssh代理,以及怎樣關(guān)閉ssh代理,但是,我們還沒有真正的使用過代理,如果想要真正的使用ssh代理幫助我們管理密鑰,還需要將密鑰添加到代理中,添加密鑰需要使用到ssh-add命令
ssh-add命令的使用方法非常簡(jiǎn)單,示例如下
ssh-add ~/.ssh/id_rsa_custom
上述命令表示將私鑰id_rsa_custom加入到ssh代理中,如果你沒有正確的啟動(dòng)ssh-agent,那么你在執(zhí)行ssh-add命令時(shí),可能會(huì)出現(xiàn)如下錯(cuò)誤提示。
Could not open a connection to your authentication agent.
完成上述步驟后,ssh代理即可幫助我們管理id_rsa_custom密鑰了,那么有哪些具體的使用場(chǎng)景呢,我們繼續(xù)聊。
ssh代理幫助我們選擇對(duì)應(yīng)的私鑰進(jìn)行認(rèn)證
前一篇文章中,我們總結(jié)了基于密鑰進(jìn)行認(rèn)證的方法,比如,我們?cè)谏擅荑€對(duì)時(shí),可以手動(dòng)指定密鑰的名稱,而不是使用默認(rèn)的密鑰名稱,示例如下:

如上圖所示,我們沒有使用默認(rèn)名稱id_rsa作為密鑰名稱,而是使用id_rsa_test1作為密鑰的名稱,生成了對(duì)應(yīng)的密鑰對(duì)。
此時(shí),我們想要使用新生成的密鑰對(duì)免密碼連接到10.1.0.3這臺(tái)服務(wù)器,于是,我們需要完成如下操作(具體操作可參考上一篇文章):

如上圖所示,我們將公鑰id_rsa_test1.pub發(fā)送給了10.1.0.3的root用戶,然后在A機(jī)器(10.1.0.1)上連接到C機(jī)器(10.1.0.3)時(shí),仍然提示我們輸入root@10.1.0.3的密碼,這是因?yàn)閟sh基于密鑰進(jìn)行認(rèn)證時(shí),默認(rèn)會(huì)使用~/.ssh/id_rsa進(jìn)行認(rèn)證,當(dāng)你使用非默認(rèn)名稱的私鑰進(jìn)行認(rèn)證時(shí),需要手動(dòng)指明對(duì)應(yīng)的私鑰,如果不指明對(duì)應(yīng)的私鑰,ssh仍然會(huì)默認(rèn)使用~/.ssh/id_rsa進(jìn)行認(rèn)證,上例就是這種情況,由于我們沒有使用~/.ssh/id_rsa進(jìn)行認(rèn)證,同時(shí)沒有指明對(duì)應(yīng)的私鑰,ssh會(huì)使用id_rsa與id_rsa_test1.pub進(jìn)行匹配,它們本來就不是一對(duì)密鑰,自然無法認(rèn)證成功,所以ssh仍然提示我們輸入密碼,我們可以使用 -i 選項(xiàng)指定對(duì)應(yīng)的私鑰文件進(jìn)行認(rèn)證,示例如下

如上圖所示,指明對(duì)應(yīng)的私鑰后,即可正常的使用密鑰進(jìn)行認(rèn)證,從而免去輸入用戶的密碼。
如果我們手中有很多密鑰對(duì),它們對(duì)應(yīng)的公鑰被不同的服務(wù)器所持有,那么,我們連接不同的服務(wù)器時(shí),就需要手動(dòng)指定對(duì)應(yīng)的不同的私鑰,而ssh代理可以幫助我們管理這些私鑰,從而避免手動(dòng)的指定私鑰。
示例如下

如上圖所示,我們啟動(dòng)了ssh-agent進(jìn)程,然后將私鑰id_rsa_test1加入到了ssh代理中,再次使用非默認(rèn)名稱的私鑰進(jìn)行認(rèn)證時(shí),并不用指明密鑰,ssh-agent會(huì)幫助我們選擇對(duì)應(yīng)的私鑰,進(jìn)行正確的認(rèn)證,當(dāng)本機(jī)有多個(gè)密鑰對(duì),并且它們的公鑰分布于很多不同的機(jī)器時(shí),會(huì)非常有用。
ssh代理能夠免去重復(fù)輸入私鑰密碼的操作
當(dāng)我們?yōu)樗借€設(shè)置了密碼,ssh基于密鑰進(jìn)行認(rèn)證時(shí),會(huì)提示輸入私鑰的密碼,輸入正確的私鑰密碼,才能夠使用對(duì)應(yīng)私鑰進(jìn)行認(rèn)證,示例如下
生成密鑰對(duì),同時(shí)指定私鑰的密碼
ssh-keygen -f ~/.ssh/id_rsa_test2 -P’123456′
將公鑰添加到遠(yuǎn)程用戶的公鑰認(rèn)證文件中,提示輸入遠(yuǎn)程用戶的密碼。
ssh-copy-id -i ~/.ssh/id_rsa_test2.pub root@10.1.0.3
root@10.1.0.3’s password:
指定對(duì)應(yīng)私鑰連接遠(yuǎn)程用戶,提示輸入對(duì)應(yīng)私鑰的密碼,正確的輸入私鑰的密碼,即可連接到遠(yuǎn)程用戶
ssh -i ~/.ssh/id_rsa_test2 root@10.1.0.3
Enter passphrase for key ‘/root/.ssh/id_rsa_test2’:
但是,如果為私鑰設(shè)置了密碼,每次使用私鑰進(jìn)行認(rèn)證連接是,都會(huì)要求輸入私鑰密碼,如果你在當(dāng)前ssh會(huì)話中需要反復(fù)的連接到遠(yuǎn)程用戶,那么反復(fù)的輸入復(fù)雜的私鑰密碼,的確會(huì)比較麻煩,ssh-agent可以幫助我們,在一個(gè)ssh會(huì)話中,只要輸入一次私鑰密碼,在同一ssh會(huì)話中之后再次使用到相同的私鑰時(shí),即可不用再次輸入對(duì)應(yīng)密碼,示例如下。

如上圖所示
第1步:?jiǎn)?dòng)ssh代理
第2步:將對(duì)應(yīng)私鑰添加到ssh代理中,在添加私鑰時(shí),會(huì)提示輸入私鑰的密碼,此時(shí),正確的輸入私鑰密碼即可將私鑰添加到ssh代理中。
第3步:連接到遠(yuǎn)程用戶,并使用對(duì)應(yīng)私鑰進(jìn)行認(rèn)證,已經(jīng)不用輸入私鑰密碼,即可連接到遠(yuǎn)程用戶,從遠(yuǎn)程用戶的會(huì)話中退出,回到當(dāng)前ssh會(huì)話中。
第4步:在當(dāng)前會(huì)話中,再次連接到遠(yuǎn)程用戶,同樣沒有提示輸入密碼。
從上述示例可以看出,在同一個(gè)ssh會(huì)話中,ssh-agent可以幫助我們免去重復(fù)輸入私鑰密碼的操作。
管理ssh代理中的密鑰
如果我們想要查看ssh代理中已經(jīng)添加了哪些私鑰,該怎樣查看呢?使用’ssh-add -l’即可查看,示例如下

如上圖所示,id_rsa_test1與id_rsa_test2這兩個(gè)RSA類型的私鑰已經(jīng)被添加到了ssh代理中。
我們還可以列出代理中所有私鑰對(duì)應(yīng)的公鑰內(nèi)容,示例如下

如果我們想要從代理中移除某個(gè)已經(jīng)添加的私鑰,可以使用’ssh-add -d’命令指定要移除的私鑰,示例如下

我們也可以一次性清空代理中的所有私鑰,使用’ssh-add -D’命令即可。
如果我們想要臨時(shí)鎖定ssh代理,則可以對(duì)ssh代理添加密碼,并進(jìn)行鎖定,鎖定后的ssh代理無法繼續(xù)幫助我們管理私鑰,除非解鎖以后,才能正常的幫助我們管理私鑰,示例如下,在正常情況下,ssh代理可以幫助我們管理私鑰,我們可以使用’ssh-add -x’命令對(duì)代理加鎖,加鎖時(shí)會(huì)提示輸入密碼,這個(gè)密碼在解鎖時(shí)需要用到,加鎖后,再次連接遠(yuǎn)程用戶時(shí),ssh代理已經(jīng)失效,除非我們對(duì)代理進(jìn)行解鎖,使用’ssh-add -X’命令(大寫X)對(duì)代理解鎖,解鎖時(shí)需要輸入加鎖時(shí)設(shè)定的密碼,解鎖后,ssh代理恢復(fù)正常。

總結(jié)
啟動(dòng)ssh-agent
如下兩種方式均可啟動(dòng)ssh-gent
方式一:創(chuàng)建子shell,在子shell中運(yùn)行ssh-agent進(jìn)程,退出子shell自動(dòng)結(jié)束代理。
ssh-agent $SHELL
方式二:?jiǎn)为?dú)啟動(dòng)一個(gè)代理進(jìn)程,退出當(dāng)前shell時(shí)最好使用ssh-agent -k關(guān)閉對(duì)應(yīng)代理
eval `ssh-agent`
關(guān)閉ssh-agent
ssh-agent -k
將私鑰添加到ssh代理
ssh-add ~/.ssh/key_name
查看代理中的私鑰
ssh-add -l
查看代理中的私鑰對(duì)應(yīng)的公鑰
ssh-add -L
移除指定的私鑰
ssh-add -d /path/of/key/key_name
移除代理中的所有私鑰
ssh-add -D
鎖定ssh代理
鎖定時(shí)需要指定鎖定密碼,鎖定后的ssh代理暫時(shí)不能幫助我們管理私鑰
ssh-add -x
解鎖ssh代理
解鎖時(shí)需要輸入創(chuàng)建鎖時(shí)設(shè)定的密碼,解鎖后ssh代理可正常工作
ssh-add -X
好了,這篇文章就總結(jié)到這里,希望能夠?qū)δ阌兴鶐椭?/span>
好了,這篇文章的內(nèi)容發(fā)貨聯(lián)盟就和大家分享到這里,如果大家網(wǎng)絡(luò)推廣引流創(chuàng)業(yè)感興趣,可以添加微信:80709525 備注:發(fā)貨聯(lián)盟引流學(xué)習(xí); 我拉你進(jìn)直播課程學(xué)習(xí)群,每周135晚上都是有實(shí)戰(zhàn)干貨的推廣引流技術(shù)課程免費(fèi)分享!