做爲一名 linux 管理員,在多臺 Linux 服務器上登錄進行遠程操做是天天工做的一部分。但隨着服務器的增多,每次登錄,系統都會提示輸入用戶名和密碼,頻繁的輸入用戶名和密碼是一件讓人很煩的事情。也許有人說能夠用一些客戶端工具,好比:SecureCRT 等,的確使用這些軟件會方便不少,可是這些軟件不是價格昂貴的商業軟件就是依附於特定平臺才能安裝使用,因此我今天介紹的是使用 ssh 自帶的功能實現使用客戶端工具所能帶來的便利,那就是使用 ssh 的公鑰密鑰實現自動登錄。linux
測試環境:
操做系統:Red Hat Enterprise Linux AS release 4 (Nahant Update 8)
軟件版本:OpenSSH_3.9p1, OpenSSL 0.9.7a
管理服務器: ip:192.168.0.1 機器名:server
被管理服務器:ip:192.168.0.2 機器名:client算法
第一步:生成 ssh 公鑰密鑰對
首先,若是你沒有安裝OpenSSH,請先安裝,這個廢話了,咱們如今的 linux 服務器默認都安裝 openssh 的軟件。
生成公鑰密鑰對是在管理服務器上生成的:緩存
[root@server ~]# ssh-keygen -b 1024 -t rsa Enter file in which to save the key (/home/usrname/.ssh/id_dsa): #詢問公鑰和私鑰存放的位置,回車用默認位置便可服務器 Enter passphrase (empty for no passphrase): #詢問輸入私鑰密語,輸入密語ssh Enter same passphrase again: #再次提示輸入密語確認ide Your identification has been saved in /home/usrname/.ssh/id_dsa. #提示公鑰和私鑰已經存放在/root/.ssh/目錄下 The key fingerprint is: |
簡單說明一下:
-b 1024 採用長度爲1024字節的公鑰/私鑰對,最長4096字節,通常1024或2048就足夠知足安全須要了,太長的話加密解密須要的時間也增加。
-t rsa 採用rsa加密方式的公鑰/私鑰對,除了rsa還有dsa方式,rsa方式最短不能小於768字節長度。
若是還須要使用更多其餘參數請參考man ssh-keygen。加密
在生成密鑰對的過程當中你被詢問:輸入密碼短句 Enter passphrase (empty for no passphrase) ,密碼短句(passphrase)是你使用一個短語或者一句話做爲密碼輸入,再由系統內部的加密或是散列算法生成虛擬密碼後,進行下一步的認證。好處是加強了安全性不易被破解。看過不少文章,裏面都把這個短句輸入爲空,也就是表明不使用密碼短句。在這裏我強烈要求你輸入密碼短句。有人會說使用密碼短句後,登錄還要輸入密碼短句這樣使用沒有比使用用戶名和密碼登錄方便多少,我說請你不要急,接着看個人文章。
注意:若是你生成密鑰對而不設置密碼短語,那麼若是你的私鑰丟失了,那麼就你的麻煩可能會比丟失用戶名密碼還嚴重。
第二步:拷貝你的公鑰到被管理的服務器上
在你的管理服務器上把你的公鑰拷貝到被管理服務器上要進行自動登錄的用戶目錄下。
[root@server ~]# scp .ssh/id_dsa.pub remote_usrname@192.168.0.2: #好比你想使用用戶peter登錄,則remote_usrname請以peter代替 |
更名和進行權限設置
登錄被管理的服務器,進入須要遠程登錄的用戶目錄,把公鑰放到用戶目錄的 .ssh 這個目錄下(若是目錄不存在,須要建立~/.ssh目錄,並把目錄權限設置爲700),把公鑰更名爲authorized_keys2,而且把它的用戶權限設成600。
[peter@client ~]$ ls id_rsa.pub [peter@client ~]$ mkdir ~/.ssh #若是當前用戶目錄下沒有 .ssh 目錄,請先建立目錄 [peter@client ~]$ chmod 700 ~/.ssh [peter@client ~]$ mv id_rsa.pub ~/.ssh [peter@client ~]$ cd ~/.ssh [peter@client ~]$ cat id_rsa.pub >> authorized_keys2 [peter@client ~]$ rm -f id_rsa.pub [peter@client ~]$ chmod 600 authorized_keys2 [peter@client ~]$ ls -l total 4 -rw------- 1 peter peter 225 Oct 10 11:28 authorized_keys2 |
測試使用密鑰對進行遠程登錄
[root@server ~]# ssh peter@192.168.0.2 Enter passphrase for key '/root/.ssh/id_rsa': #提示輸入密碼短語,請輸入剛纔設置的密碼短語 Last login: Sun Oct 10 11:32:14 2010 from 192.168.0.1 [peter@client ~]$ |
若是你不能用正確的登陸,應該從新檢查一下你的authorized_keys2的權限。也可能要檢查.ssh目錄的權限。
使用 ssh-agent(ssh代理)自動輸入密碼短語
牢記你的「密碼短句」,如今你能夠用你的密鑰而不是密碼來登陸你的服務器了,可是這樣仍然沒有省什麼事,你仍是要輸入密鑰的「密碼短語」。有更簡便的方法嗎?答案就是採用SSH代理(ssh-agent),一個用來幫你記住「密碼短語」的程序。 ssh-agent是OpenSSH中默認包括的ssh代理程序。
登錄管理服務器
[root@server ~]# ssh-agent SSH_AUTH_SOCK=/tmp/ssh-vEGjCM2147/agent.2147; export SSH_AUTH_SOCK; SSH_AGENT_PID=2148; export SSH_AGENT_PID; echo Agent pid 2148; |
當你運行ssh-agent,它會打印出來它使用的 ssh 的環境和變量。要使用這些變量,有兩種方法,一種是手動進行聲明環境變量,另外一種是運行eval命令自動聲明環境變量。
方法一:手動聲明環境變量
[root@server ~]# SSH_AUTH_SOCK=/tmp/ssh-vEGjCM2147/agent.2147; export SSH_AUTH_SOCK; [root@server ~]# SSH_AGENT_PID=2148; export SSH_AGENT_PID; [root@server ~]# printenv | grep SSH #檢查 ssh 環境變量是否已經加入當前會話的環境變量 SSH_AGENT_PID=2148 SSH_AUTH_SOCK=/tmp/ssh-vEGjCM2147/agent.2147 |
方法二:運行eval命令自動聲明環境變量
[root@server ~]# eval `ssh-agent` Agent pid 2157 [root@server ~]# printenv | grep SSH #檢查 ssh 環境變量是否已經加入當前會話的環境變量 SSH_AGENT_PID=2148 SSH_AUTH_SOCK=/tmp/ssh-vEGjCM2147/agent.2147 |
如今 ssh-agent 已經在運行了,可是 ssh-agent 裏面是空白的不會有解密的專用密鑰。咱們要告訴它咱們有私鑰和這個私鑰在哪兒。這就須要使用 ssh-add 命令把咱們的專用密鑰添加到 ssh-agent 的高速緩存中。
[root@server ~]# ssh-add ~/.ssh/id_dsa
|
輸入了密碼短句,如今好了,你能夠登陸你的遠程服務器而不用輸入你的密碼短語了,並且你的私鑰是密碼保護的。試試看是否是很爽!
[root@server ~]# ssh peter@192.168.0.2 Last login: Sun Oct 10 11:32:45 2010 from 192.168.0.1 [peter@client ~]$ |
登錄服務器進行操做結束後,記得還要把 ssh-agent 關掉,否則其餘人登錄後也能夠遠程了。
[root@server ~]# ssh-agent -k unset SSH_AUTH_SOCK; unset SSH_AGENT_PID; echo Agent pid 2148 killed; [root@server ~]# ssh-add -l #查看一下,緩存裏已經沒有了密鑰了 The agent has no identities. |
呵呵,爽了吧,固然了若是管理數量衆多的服務器(服務器數量≥2位數),第一次上傳公鑰可能會是比較累的工做,可是之後就能夠在維護工做中體會這種公鑰密鑰自動登錄的便利了。
本文出自 「小苗」 博客,請務必保留此出處http://7056824.blog.51cto.com/69854/403669