Shell-Script

如何將我的 SSH 發布密鑰傳播到伺服器列表,而不必一遍又一遍地輸入我的密碼?

  • July 21, 2016

我最近獲得了對伺服器列表的使用者名/密碼訪問權限,並希望將我的 SSH 公鑰傳播到這些伺服器,以便我可以更輕鬆地登錄。

這樣就很清楚了:

  • 遠端伺服器上沒有任何預先存在的公鑰可以用來自動執行此操作
  • 這是我第一次登錄這些伺服器,我不想經常輸入我的憑據來訪問它們
  • 我也不想ssh-copy-id在 for 循環中一遍又一遍地輸入我的密碼。

而不是多次輸入您的密碼,您可以使用pssh它的-A開關來提示輸入一次,然後將密碼提供給列表中的所有伺服器。

**注意:**使用此方法不允許您使用ssh-copy-id,但是,您需要滾動自己的方法來將 SSH 發布密鑰文件附加到遠端帳戶的~/.ssh/authorized_keys文件中。

例子

這是一個完成這項工作的範例:

$ cat ~/.ssh/my_id_rsa.pub                    \
   | pssh -h ips.txt -l remoteuser -A -I -i  \
   '                                         \
     umask 077;                              \
     mkdir -p ~/.ssh;                        \
     afile=~/.ssh/authorized_keys;           \
     cat - >> $afile;                        \
     sort -u $afile -o $afile                \
   '
Warning: do not enter your password if anyone else has superuser
privileges or access to your account.
Password:
[1] 23:03:58 [SUCCESS] 10.252.1.1
[2] 23:03:58 [SUCCESS] 10.252.1.2
[3] 23:03:58 [SUCCESS] 10.252.1.3
[4] 23:03:58 [SUCCESS] 10.252.1.10
[5] 23:03:58 [SUCCESS] 10.252.1.5
[6] 23:03:58 [SUCCESS] 10.252.1.6
[7] 23:03:58 [SUCCESS] 10.252.1.9
[8] 23:03:59 [SUCCESS] 10.252.1.8
[9] 23:03:59 [SUCCESS] 10.252.1.7

上述腳本的結構一般如下:

$ cat <pubkey> | pssh -h <ip file> -l <remote user> -A -I -i '...cmds to add pubkey...'

高級pssh細節

  • cat <pubkey>將公鑰文件輸出到pssh
  • pssh使用-I開關通過 STDIN 攝取數據
  • -l <remote user>是遠端伺服器的帳戶(我們假設您在 IP 文件中的伺服器上擁有相同的使用者名)
  • -A告訴pssh詢問您的密碼,然後將其重新用於它連接到的所有伺服器
  • -i告訴pssh將任何輸出發送到 STDOUT 而不是將其儲存在文件中(其預設行為)
  • '...cmds to add pubkey...'- 這是正在發生的事情中最棘手的部分,所以我將自行分解*(見下文)*

在遠端伺服器上執行的命令

這些是pssh將在每台伺服器上執行的命令:

'                                         \
 umask 077;                              \
 mkdir -p ~/.ssh;                        \
 afile=~/.ssh/authorized_keys;           \
 cat - >> $afile;                        \
 sort -u $afile -o $afile                \
'

為了:

  • 將遠端使用者的 umask 設置為 077,這樣我們將要創建的任何目錄或文件都將相應地設置其權限,如下所示:
$ ls -ld ~/.ssh ~/.ssh/authorized_keys
drwx------ 2 remoteuser remoteuser 4096 May 21 22:58 /home/remoteuser/.ssh
-rw------- 1 remoteuser remoteuser  771 May 21 23:03 /home/remoteuser/.ssh/authorized_keys
  • 創建目錄~/.ssh並忽略警告我們是否已經存在
  • 設置一個變數 ,$afile帶有到授權密鑰文件的路徑
  • cat - >> $afile- 從 STDIN 獲取輸入並附加到 authorized_keys 文件
  • sort -u $afile -o $afile- 對authorized_keys 文件進行唯一排序並保存

**注意:**最後一點是為了處理您在同一伺服器上多次執行上述內容的情況。這將消除您的 pubkey 被多次附加。

注意單個滴答聲!

還要特別注意所有這些命令都嵌套在單引號內。這很重要,因為我們不想$afile在遠端伺服器上執行之前進行評估。

'               \
  ..cmds...    \
'

我已經擴展了上面的內容,所以在這裡更容易閱讀,但我通常在一行上執行它,如下所示:

$ cat ~/.ssh/my_id_rsa.pub | pssh -h ips.txt -l remoteuser -A -I -i 'umask 077; mkdir -p ~/.ssh; afile=~/.ssh/authorized_keys; cat - >> $afile; sort -u $afile -o $afile'

獎金材料

通過使用pssh,您可以放棄建構文件並使用提供動態內容,或者您​​可以使用另一個開關-h <(...some command...)創建 IP 列表, .pssh``-H "ip1 ip2 ip3"

例如:

$ cat .... | pssh -h <(grep -A1 dp15 ~/.ssh/config | grep -vE -- '#|--') ...

以上可用於從我的~/.ssh/config文件中提取 IP 列表。當然,您也可以使用它printf來生成動態內容:

$ cat .... | pssh -h <(printf "%s\n" srv0{0..9}) ....

例如:

$ printf "%s\n" srv0{0..9}
srv00
srv01
srv02
srv03
srv04
srv05
srv06
srv07
srv08
srv09

您也可以seq用來生成格式化的數字序列!

參考資料和類似工具pssh

如果您不想像pssh我在上面那樣使用,還有一些其他選項可用。

引用自:https://unix.stackexchange.com/questions/204985