情景linux--建立信任關系時,你還在使用scp分發.pub文件嗎?

情景

從一臺linux主機的某一用戶上(以A代表),ssh登錄到另一臺linux主機的某一用戶上(以B代表),或者用遠程拷貝命令scp或rsync向B拷貝文件時,都需要輸入B的密碼。

偶爾用一次,輸入一次密碼倒也不算什么。但,有需求進行多次登錄或拷貝,甚至希望使用腳本實現,輸入密碼的操作就太耗力費時了。

對于有一定linux基礎的人來說,不難想到可以在兩臺主機間建立信任關系。

但,建立信任關系時,你是如何分發.pub文件的呢?

信任關系

建立信任關系大體上需要三個步驟:

  1. 創建私鑰和公鑰
  2. 分發公鑰
  3. 驗證效果

以A和B為例,如果希望A登錄B或向B拷貝文件時不需要輸入B的密碼,則需要在A上創建私鑰,并將相應的公鑰分發到B上,也就是說信任關系的建立是單向的。如果需要雙向信任,則需要在B上進行相同的操作。

如下例子在A上創建私鑰。

創建私鑰和公鑰

創建私鑰前最好先查看一下~/.ssh目錄下是否已經存在了私鑰和公鑰。

私鑰和公鑰一般創建后是成對存在的,如下面:

identity對應identity.pub
id_dsa對應id_dsa.pub
id_rsa對應id_rsa.pub

如果已經已經有了,可以不必重新創建。如果沒有就創建下。

創建私鑰的命令是ssh-keygen,本文的重點不在它,所以關于它的用法從簡介紹。

$ ssh-keygen

不帶任何參數運行,一路回車就搞定了。

Generating public/private rsa key pair.
Enter file in which to save the key (/home/j-tester/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/j-tester/.ssh/id_rsa.
Your public key has been saved in /home/j-tester/.ssh/id_rsa.pub.
The key fingerprint is:
75:c8:db:b1:b6:7b:ef:7d:ca:55:ac:84:3d:f3:95:28 j-tester@test153.tester.com
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|         . .     |
|          + o    |
|         . + =...|
|        S .E=.=.+|
|           ..o =o|
|            . . o|
|             o..o|
|            ..o+=|
+-----------------+

如上,會在~/.ssh目錄下生成id_rsaid_rsa.pub

$ ls -1 ~/.ssh/
id_rsa
id_rsa.pub

分發公鑰

本文主要討論分發公鑰的方式。分發公鑰,簡單說,就是要把A上的~/.ssh/id_rsa.pub的內容追加到B的~/.ssh/authorized_keys文件中,并為對應的文件和目錄賦予權限。

方案1

  1. 在A上,查看~/.ssh/id_rsa.pub的內容并復制;
  2. 登錄B,將這些內容追加到B的~/.ssh/authorized_keys文件中;
  3. 分發公鑰后,如果B的~/.ssh目錄和~/.ssh/authorized_keys文件是本次新建的,則還需要為它們設置權限,這里不詳細討論,一種可行的選擇是:B的~/.ssh目錄權限應為700,B的~/.ssh/authorized_keys文件權限應為600。

注意,這里可能存在的情況有:

  1. B的~/.ssh目錄不存在,需要你手動創建;
  2. B的~/.ssh/authorized_keys已經存在并有其它內容,所以要把復制的內容追加進去,而不是覆蓋;

方案2

  1. 通過scp(或rsync)將文件~/.ssh/id_rsa.pub遠程拷貝到B的某目錄中;
  2. 再將這個文件的內容追加到B的~/.ssh/authorized_keys文件內;
  3. 將該文件刪除掉;
  4. 同方案1,如果B的~/.ssh目錄和~/.ssh/authorized_keys文件是本次新建的,則還需要為它們設置權限。

注意,這里可能存在的情況有:

  1. B的~/.ssh目錄不存在,需要你手動創建;
  2. B的~/.ssh/authorized_keys已經存在并有其它內容,所以要把復制的內容追加進去;
  3. B的~/.ssh下存在id_rsa.pub這個文件,如果你遠程拷貝到的目錄是B的~/.ssh目錄,則會將B的~/.ssh/id_rsa.pub給覆蓋掉,所以需要你對B的命令和文件內容事先進行了解;

方案3

方案1和方案2的做法,起初是我從網絡上搜索知道的,結合自己的經驗進行了改善(上面提到的可能存在的情況),然后一直沿用至近期。

要不是最近有同事問我創建信任關系時的命令是什么,而我又一時忘記了怎么正確拼寫,這才進行了命令搜索apropos ssh想知道為什么,請看這里),我想我現在還不知道有更好的方法呢!

$ apropos ssh | fgrep "(1)"
git-shell            (1)  - Restricted login shell for GIT-only SSH access
ssh                  (1)  - OpenSSH SSH client (remote login program)
ssh [slogin]         (1)  - OpenSSH SSH client (remote login program)
ssh-add              (1)  - adds RSA or DSA identities to the authentication agent
ssh-agent            (1)  - authentication agent
ssh-copy-id          (1)  - install your public key in a remote machine's authorized_keys
ssh-keygen           (1)  - authentication key generation, management and conversion
ssh-keyscan          (1)  - gather ssh public keys

在確認了ssh-keygen的情況下,也無意間發現了ssh-copy-id

ssh-copy-id (1) - install your public key in a remote machine's authorized_keys

先看一下ssh-copy-id的用法:

$ man ssh-copy-id
NAME
       ssh-copy-id - install your public key in a remote machine’s authorized_keys
SYNOPSIS
       ssh-copy-id [-i [identity_file]] [user@]machine
DESCRIPTION
       ssh-copy-id  is a script that uses ssh to log into a remote machine (presumably using a login password, so password authentication should be enabled, unless you’ve done some clever use of multiple identities) It also changes the permissions of the remote user’s home, ~/.ssh, and ~/.ssh/authorized_keys to remove group writability (which would otherwise prevent you from logging in, if the remote sshd has StrictModes set in its configuration). 
...(省略)...

在這里,ssh-copy-id [-i [identity_file]] [user@]machine中的usermachine分別是B的${USER}和${HOSTNAME}。

所以,你只需要在A上執行命令:

$ ssh-copy-id -i ~/.ssh/id_rsa.pub j-tester@test188.tester.com

輸入B的密碼后,出現如下提示文字表示執行成功。

...(省略)...
Now try logging into the machine, with "ssh 'j-tester@test188.tester.com'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

對比

在比較順利的情況下,方案1和方案2已然需要操作好幾步,如果碰到那些可能存在的情況,還需要額外增加手工操作。而方案3只需要一條命令就搞定了。孰優孰劣,一目了然。

更進一步,ssh-copy-id命令其實是一個shell腳本,讀懂它,你就能知道它為什么好用了。

驗證效果

上述步驟完成后,你可以驗證一下效果,最簡單的莫過于直接ssh到遠程主機上了:

如果不需要輸入密碼就登錄成功了,則說明信任關系創建成功。

如果還是需要密碼,說明創建不成功,再回去找原因。

擴展知識

  1. ssh-keygen用法;
  2. RSA和DSA認證相關;
  3. ssh-copy-id的內容;
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,698評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,202評論 3 426
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,742評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,580評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,297評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,688評論 1 327
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,693評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,875評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,438評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,183評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,384評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,931評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,612評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,022評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,297評論 1 292
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,093評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,330評論 2 377

推薦閱讀更多精彩內容

  • SSH 為 Secure Shell 的縮寫,由 IETF 的網絡小組(Network Working Group...
    shuff1e閱讀 1,786評論 1 11
  • 為了讓兩個linux機器之間使用ssh不需要用戶名和密碼。所以采用了數字簽名RSA或者DSA來完成這個操作。 ...
    Sunshine_Boys閱讀 5,301評論 0 4
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,816評論 18 139
  • 看到題目有沒有一種高大上的感覺?毛線,當前是個人、是個公司都在說自己搞大數據,每天沒有幾個PB的數據入庫,每天沒有...
    丁小晶的晶小丁閱讀 4,517評論 0 50
  • SSH全稱Secure SHell,顧名思義就是非常安全的shell的意思,SSH協議是IETF(Internet...
    StarShift閱讀 2,553評論 0 7