免交互方式批量分發公鑰腳本
作者: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
-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
但是在ssh-coyp-id命令中,因這個命令腳本中出現了2次shift,所以第三個參數才 是第一個。
▲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)'"
以下是上面腳本其中一段命令的解釋:
1)exec sh -c --- 在腳本中臨時設置環境變量信息
2)cd --- 切換到當前用戶家目錄
3)umask 077 --- 設置臨時的umask值
4)test -d .ssh || mkdir .ssh --- 判斷當前用戶家目錄是否存在.ssh目錄,如果不存在就進行 創建
5)cat >> .ssh/authorized_keys && ...省略...
--- 遠程登錄到相應主機上, 將公鑰信息保存到遠程主機相應用戶家目錄中 的.ssh/authorized_keys,並將authorized_keys權限設置為600(6 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被管理端軟件
免交互方式批量分發公鑰腳本