Shell-Script
如何將我的 SSH 發布密鑰傳播到伺服器列表,而不必一遍又一遍地輸入我的密碼?
我最近獲得了對伺服器列表的使用者名/密碼訪問權限,並希望將我的 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
我在上面那樣使用,還有一些其他選項可用。