一、單向無密碼訪問
單向無密碼訪問遠程服務器操作比較簡單,比如服務器A需要無密碼訪問服務器B(A–>B),那麼只需要在服務器A生成密鑰對,將生成的公鑰上傳到服務器B的相關用戶目錄下的.ssh目錄中(沒有的話手動創建,注意,它的目錄權限是700),並將公鑰文件名稱改爲authorized_keys(注意,這個文件的權限應該是644),如果已存在authorized_keys文件,則把id_rsa.pub的內容追加到authorized_keys文件中。請注意.ssh目錄及authorized_keys文件的權限,權限不符,會使配置無效。具體操作如下:
1、在需要無密碼登錄遠程服務器的機器上(本例爲服務器A)生成密碼對:
在生成的過程中有幾個選項讓你輸入密鑰對的保存目錄及輸入私鑰,直接enter就行了。
[root@A ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory ‘/root/.ssh’.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint
執行上面一步,會在~/.ssh目錄下生成兩個文件id_rsa和id_rsa.pub, 其中id_rsa是私鑰,保存在本機;id_rsa.pub是公鑰,是要上傳到遠程服務器的。
2、上傳公鑰到需要無密碼登陸的遠程服務器B上並將內容追加到./ssh/authorized_keys
遠程服務器B上如果沒有.ssh目錄的話,先手動創建:
[root@B ~]# mkdir .ssh
[root@B ~]# chmod 755 .ssh
然後從服務器A上傳公鑰文件到遠程服務器B:
[root@A ~]# scp .ssh/id_rsa.pub [email protected]:/root/id_ras.pub
[root@A ~]# cat id_rsa.pub >>.ssh/authorized_ke
//這一步會將遠程服務器B加入到本機(服務器A)的known_hosts列表中
3、測試
上傳完公鑰文件到遠程後,馬上從服務器A登陸到服務器B,如果沒有輸入密碼登陸到了服務器B,表示成功,如果還要輸入密碼,則請檢查遠程服務器B上的.ssh目錄權限是否爲700,上傳的遠程服務器上的公鑰名是否改爲了authorized_keys,權限是否爲644
二、多臺服務器相互無密碼訪問
多臺服務器相互無密碼訪問,與兩臺服務器單向無密碼訪問的原理是一樣的,只不過由於是多臺服務器之間相互無密碼訪問,不能象兩臺服務器無密碼登錄那樣直接上傳,步驟如下:
1、在每臺服務器上都執行ssh-keygen -t rsa生成密鑰對:
#ssh-keygen -t rsa
2、在每臺服務器上生成密鑰對後,將公鑰複製到需要無密碼登陸的服務器上:
舉例如192.168.1.120,192.168.1.121,192.168.1.122這三臺服務器需要做相互免密碼登陸,在每臺服務器生成密鑰對後,在每臺服務器上執行ssh-copy-id命令(具體說明及用法見最後附錄),將公鑰複製到其它兩臺服務器上(此處以192.168.1.120爲例,用戶爲root,其它兩臺步驟相同)
#ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.121
#ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.122
以上命令,可以自動將公鑰添加到名爲authorized_keys的文件中,在每臺服務器都執行完以上步驟後就可以實現多臺服務器相互無密碼登陸了
附ssh-copy-id介紹及用法:
Linux系統裏缺省都包含一個名爲ssh-copy-id的工具:
你用cat或者more命令看一下就知道ssh-copy-id本身其實就是一個shell腳本,用法很簡單:
# ssh-copy-id -i ~/.ssh/id_rsa.pub user@server
再也不用記如何拼寫authorized_keys這個文件名了,是不是很爽,可惜別高興太早了,ssh-copy-id有一個很要命的問題,那就是缺省它僅僅支持SSH運行在22端口的情況,不過實際上出於安全的需要,我們往往都會更改服務器的SSH端口,比如說改成10022端口,這時候你運行ssh-copy-id就會報錯了,直接修改ssh-copy-id腳本當然可以修正這個問題,但是那樣顯得太生硬了,實際上還有更好的辦法:
# vi ~/.ssh/config
加上內容:
Host server
Hostname ip
Port 10022
你也可以單獨只加入Port一行配置,那樣就是一個全局配置,保存後再運行ssh-copy-id命令就不會報錯了。
補充:經網友提示,如果端口不是22,不修改config文件,按如下方式也可以:
ssh-copy-id -i ~/.ssh/id_rsa.pub “-p 10022 user@server
可能遇到的問題:
1.進行ssh登錄時,出現:”Agent admitted failure to sign using the key“ .
執行:
$ssh-add
強行將私鑰 加進來。
2.如果無任何錯誤提示,可以輸密碼登錄,但就是不能無密碼登錄,在被連接的主機上(如A向B發起ssh連接,則在B上)執行以下幾步:
$chmod o-w ~/
$chmod 700 ~/.ssh
$chmod 600 ~/.ssh/authorized_keys
3.如果執行了第2步,還是不能無密碼登錄,再試試下面幾個
$ps -Af | grep agent
檢查ssh代理是否開啓,如果有開啓的話,kill掉該代理,然後執行下面重新打開一個ssh代理,如果沒有開啓,直接執行下面:
$ssh-agent
還是不行的話,執行下面,重啓一下ssh服務
$sudo service sshd restart
- 執行ssh-add時提示“Could not open a connection to your authenticationh agent”而失敗 執行:
$ssh-agent bash