說明:下文中說的
'客戶端'指的是你所使用的本地機器;
'服務端'指的是遠程你要連接的機器;
----------------------------------------------------------
1.首先在客戶端打開shell窗口,輸入能生成'公鑰,私鑰對'的命令:
ssh-keygen -t rsa -P '' #注意參數-P中的P是大寫的
#-P后面的單引號對與大寫P之前有空格
2.稍等會讓你輸入生成的文件保存在哪,默認的位置是家目錄,一般直接回車即可
#在沒改變存儲位置的情況下,會在家目錄生成一個隱藏的.ssh文件夾,並且在.ssh文件夾里又生成了一個公鑰文件:id_rsa.pub,和一個私鑰文件:id_rsa
#.ssh為隱藏文件,直接ls顯示不出來,要用ls -a才能顯示出來,看不看得見都不影響cd .ssh命令
3.利用scp或其它方式將.ssh文件夾中的公鑰復制到服務器端(我是用scp復制的)
scp /home/pi/.ssh/id_rsa.pub yang@138.128.204.165:/home/yang/
#因為是利用scp方式傳輸的,所以會提示你輸密碼,如果已實現ssh的免密碼登錄了,再用scp的時候就不用再輸密碼了
#其實scp傳輸的時候也有幾個坑,如果沒系統的看過scp文檔的話,簡單說一下:1.其實我傳文件的時候用的不是上面寫的那條命令,而是scp -P 10022 /home/pi/.ssh/id_rsa.pub yang@138.128.204.165:/home/yang/,可以看到多了個'-P 10022',是因為我的ssh服務端設置的ssh連接端口號是10022,其實平時咱們看到的沒有加端口的命令實際上是有一個隱式的-P 22在里面呢(22是ssh安裝時默認的端口),就相當於你寫了'scp 本地/遠程 遠程/本地后',scp還會處理一下,變成'scp -P 22 本地/遠程 遠程/本地'再發送到遠端的服務器
4.在遠程服務器的家目錄下創建.ssh文件夾,然后將家目錄的剛剛從本地傳過去的id_rsa.pub復制到.ssh文件夾下,並且改名為authorized_keys
#我是在遠程服務器上也執行了1中的命令系統給生成的,不過這樣比直接用mkdir創建麻煩,當時就是考慮是不是自己創建不行,是不是在遠程服務器的.ssh也是要用1中的命令創建的呢,保險起見那么辦的
#!網上的教程不是先將id_rsa.pub復制到.ssh后改名為authorized_keys,而是在家目錄就直接用cat id_rsa.pub >>.ssh/authorized_keys,我想應該是如果有多台機器都想免密碼連接到這台遠程服務器,可以將多台本地客戶機生成的id_rsa.pub都追加到一個文件里面(我也只是猜測,有時間實踐一下)
5.將authorized_keys的權限設置為600
#chmod 600 authorized_keys 我這里直接寫的authorized_keys是因為當前路徑就是在.ssh文件夾下,如果當前位置不是.ssh文件夾authorized_keys必須用絕對路徑
#之后再連就能連上了,關於連接這里也有一點是需要注意的,平時大家都是寫的'ssh 遠程服務器ip'這種方式連的,但有些人這么連但連接不上,為什么呢?是因為用這種方式連的人是因為遠程服務器上有和你正在登錄的用戶同名的用戶,並且遠程服務器上ssh默認的端口是22,才能用那種直接連的方式,否則,如果遠程服務器上的ssh連接密碼變了,你在連的時候就要加上'-P 端口號',如果遠程服務器上的用戶名沒有和你在本地正在登錄的這個用戶重名的,你還需要指定'-l 用戶名'才可以,所以我連接我的遠程服務器是這樣的'ssh -l yang -P 10022 aaa.bbb.ccc.ddd'.話又說回來了,就算是用'ssh ip地址'連接的,正如前面說的,在本機次命令發給遠程服務器之前它還是加工了一下,將默認的用戶名和密碼參數加上了,即你寫的是 ssh www.xxx.yyy.zzz,但發送之前ssh又處理了一下,ssh -l 本地當前登錄的用戶名 -P 22 www.xxx.yyy.zzz'然后將處理后的這條命令發到遠程服務器進行登錄操作;免密碼登錄是在前面說的基礎上再參考http://os.51cto.com/art/201209/358478.htm
設置好免密碼登錄后還連接不上的可能原因與解決辦法?
1.免密碼登錄設置以后用A用戶可以連上去,但是用B用戶就連不上了?
::記住最重要的一點,你要想用B免密碼登錄,則1.在/home/B/下必須有.ssh文件夾,2.並且.ssh文件夾里有一個authorized_keys文件(該文件其實就是將客戶端的id_rsa.pub改了個名),3.且該文件的權限為600.這可能就能解釋用A能連上用B連不上的問題了,就是因為A用戶的家目錄下有一個名叫.ssh的目標,一般該目錄的權限為700;並且.ssh目錄下有一個名為authorized_keys的文件,該文件權限為600(這里面還有一個坑!!!就是如果.ssh目錄是自建的一定要看一下文件夾權限是不是700,最重要的是如果.ssh文件夾里的authorized是從其它目錄里面復制過來的,千萬千萬要看看該文件的屬主和屬組,如果你你從A家目錄下的.ssh文件夾里復制過來的,千萬要看一下如果復制過來后authorized的屬主和屬組還是A的要用chown給改成B的,否則因為它的權限為600,只有屬主可以讀寫,而當ssh無密碼連接的時候又需要讀取該文件和客戶端的比較,因為B沒有權限所以就無法進行讀取操作,更別說比較了,故會登錄失敗(上面有一個關於免密碼登錄的原理鏈接,可以點進去看看,其中就說了,無密碼登錄會讀取.ssh里的authorized_keys文件,如果你使用的用戶對該文件沒有讀權限,結果肯定是失敗的))
追加1:免密碼登錄的時候,因為我們是將客戶端生成的公鑰放在了某一個用戶的主目錄下的.ssh文件夾里並重命名為authorized_keys,這里強調的是'一個',比如說我在/home/yang/.ssh/個路徑下我將客戶端傳過來的id_rsa.pub改名為authorized_keys,並設置文件權限為600,重啟服務后,我在客戶端連的時候只有兩種情況可以連上,假設我的ssh連接端口改成了10022,第一種:客戶端本地用戶是yang,則可以用'ssh -P 10022 xxx.xxx.xxx.xxx'去連.還有一種情況就是客戶端本地用戶不是yang則用'ssh -l yang -P 10022 xxx.xxx.xxx.xxx'去連;所以這個免密碼登錄其實是對遠程機器上的某一個或某幾個用戶而言的,而不是說你只要啟動了免密碼登錄了,隨便指定一個遠程機器上有的用戶就可以了,必須是你的公鑰傳到了哪個用戶的家目錄下的.ssh里(當然已改名為authorized.keys)你才可以用哪個用戶去免密碼登錄,否則都要輸入密碼