1. 程式人生 > >免交互方式批量分發公鑰腳本

免交互方式批量分發公鑰腳本

inux mil ssh sel null linu p s txt 端口


作者Georgekai

歸檔:學習筆記

2018/1/30

1.1 SSH

1.1.1 部署好基於ssh秘鑰的方式進行管理

1. 創建秘鑰對

ssh-keygen -t rsa

2. 分發公鑰

ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]


1.1.2 實現批量部署ssh+key環境時遇到的問題

1. 創建秘鑰對時需要進行交互,輸入回車

1)需要確認私鑰保存路徑

解決ssh-keygen -t rsa -f /root/.ssh/id_rsa

-f filename #指定私鑰文件保存的路徑

2)需要確認私鑰密碼信息

解決ssh-keygen -t rsa -f /root/.ssh.id_rsa

-P "" #指定密碼為空

-N new_passphrase #指定一個新的密碼

-P passphrase #指定一個舊的密碼

2. 分發公鑰時,需要輸入yes和密碼信息

1)需要輸入yes信息

解決ssh-copy-id -i /root/.ssh/id_rsa.pub "[email protected] -o StrictHostKeyChecking=no"

-o StrictHostKeyChecking=no #忽略回復yes的交互(避免第一次交互出現 公鑰檢查)

PS:1. 因ssh-coopy-id腳本中的配置(shift),所以[email protected]變為第一個參數$1

2. 這裏還需要解參數,需要用引號引起來,使引號內的所有內容成為一個整體(參數)

2)需要密碼信息

解決sshpass -p123456 ssh-copy-id -i /root/.ssh/id_rsa.pub "[email protected] -o StrictHostKeyChecking=no"

sshpass -p123456 #指定密碼為123456,忽略交互


分析:查看ssh-copy-id這個命令的配置文件(可分析出以下結果)

▲為什麽發布過去的公鑰信息是600的權限:umask 077

$1 :命令行後面的第一個參數(如sh kai.sh hostname

hostname就是第一個參數),

但是在ssh-coyp-id命令中,因這個命令腳本中出現了2shift,所以第三個參數才 是第一個。

shift:一個shift可以理解為忽略在命令行中的第一個參數(2個就是忽略第1個和第2個)

vim /usr/bin/ssh-copy-id

ssh $1 "exec sh -c 'cd; umask 077; test -d .ssh || mkdir .ssh ;

cat >> .ssh/authorized_keys &&

(test -x /sbin/restorecon && /sbin/restorecon .ssh .ssh/authorized_keys >/dev/null 2>&1 || true)'"


以下是上面腳本其中一段命令的解釋:

1exec sh -c --- 在腳本中臨時設置環境變量信息

2cd --- 切換到當前用戶家目錄

3umask 077 --- 設置臨時的umask

4test -d .ssh || mkdir .ssh --- 判斷當前用戶家目錄是否存在.ssh目錄,如果不存在就進行 創建

5cat >> .ssh/authorized_keys && ...省略...

--- 遠程登錄到相應主機上, 將公鑰信息保存到遠程主機相應用戶家目錄中 的.ssh/authorized_keys,並將authorized_keys權限設置為6006 6 6-0 7 7=6 -1 -1, 文件結果有奇數位,所以奇數位+1

2 如果對方端口改為52113,不在是22

sshpass -p123456 ssh-copy-id -i /root/.ssh/id_rsa.pub "172.16.1.7 -p52113"

-p52113 #指定對端端口號為52113


腳本中shift的作用:

腳本內容

#!/bin/bash

until [ $# -eq 0 ]

do

echo $*

shift

done

PS:1.$* #把所有參數都顯示出來

2.$# #統計參數的數量

執行結果:

[root@m01 scripts]# sh shift_test.sh 1 2 3 4 5 6

1 2 3 4 5 6

2 3 4 5 6

3 4 5 6

4 5 6

5 6

6

1.1.3 編寫免交互的方式 批量分發公鑰腳本

#!/bin/bash

#避免.ssh下已有公鑰信息,下次在創建時,會提示是否覆蓋

\rm /root/.ssh/id_rsa* -f

#免交互創建秘鑰對

ssh-keygen -t rsa -f /root/.ssh/id_rsa -P "" &>/dev/null #將後面輸出的沒用的信息,追加到空

#免交互分發公鑰

for ip in 7 31 41

do

sshpass -p123456 ssh-coyp-id -i /roo/.ssh/id_rsa.pud "-o StrictHostKeyChecking=no [email protected].$"

done

1.1.4 編寫批量管理腳本

vim 777.txt

#!/bin/bash

# fenfa

for ip in 7 31 41

do

echo =====================172.16.1.$ip host info==========================

ssh 172.16.1.$ip $1 #$1 表示第一個參數

echo ""

done

#執行腳本時後面不加參數的話,會先連接到172.16.1.7,在連接到31,然後從31在連接到41

執行腳本測試(後面加一個參數)

sh 777.txt "hostname" #批量查看每個主機的主機名

sh 777.txt "free -m" #批量查看每個主機的內存信息

sh 777.txt "uptime" #批量查看每個主機的負載信息

sh 777.txt "yum install libselinux-python -y" #批量安裝ansible被管理端軟件

免交互方式批量分發公鑰腳本