大家好,我是anyux。我將給大家介紹Linux多臺機器一鍵免密互信腳本。
因為很多操作工具構架需要免密鑰互信的基礎才能實現(xiàn),比如hadoop,MHA等,本人十分懶惰,不想因為反復克隆機器后,再搞復制粘貼的操作。從昨天晚上11點還完成,氣得直接睡覺去了。
白天來公司,正巧無事(一會做完了),上手就開始完成這個腳本。
心急的同學,可以直接替換head_ip(前綴ip),arr(后綴ip),passwd(密碼),以root權限直接運行
這個版本是很基礎的小腳本,就跟鬧著玩一樣。
它的不足,
依賴第三工具,并且需要以root權限安裝,運行ip限制,需要手動修改同步密鑰的算法未優(yōu)化,感覺可以優(yōu)化,雖然還不知道優(yōu)化的空間有多少
再說說它的實現(xiàn)邏輯
這里的前提,是所有同步密鑰機器的密碼一致(不一致的要等待下一個版本更新吧)
隨機一臺機器登錄,生成密鑰對,復制公鑰到其他主機認證基于循環(huán),逐個遠程登錄主機,刪除密鑰對,重新生密鑰對基于循環(huán),逐個遠程登錄主機,安裝遠程工具sshpass,復制公鑰到其他機器,還有本地主機localhost檢測多主機免密通信情況#!/bin/bash#算法密鑰#分發(fā)給指定機器#ip_headerhead_ip='192.168.255.'#ip_footerarr=(113 114 115)#用戶家密鑰目錄base_dir=~/.ssh/#公鑰pub=id_rsa.pub#私鑰key=id_rsa#用戶名稱user=root#用戶密碼passwd=root#需要root權限安裝軟件install_cmd(){yum install -y pssh sshpass}create_key(){sleep 2#刪除本地初始密鑰對rm -rf ${base_dir}sleep 1echo -e "刪除完成\n"echo "開始分發(fā)"echo "\n"echo "++++++++++++++++++++"#本地主機生成密鑰\ssh-keygen -t rsa -f ${base_dir}${key} -P ""for ip in ${arr[@]}doecho "輸出ip**********"echo "ssh root@${head_ip}${ip} "tmp='ssh-keygen -t rsa -f ${base_dir}${key} -P ""'#本地主機公鑰復制到其他主機認證文件sshpass -p${passwd} ssh-copy-id $user@${head_ip}${ip} -o StrictHostKeyChecking=no#遠程主機連接,刪除已生成的密鑰,并重新生成密鑰sshpass -p${passwd} ssh $user@${head_ip}${ip} "rm -rf ${base_dir}${key};rm -rf ${base_dir}{pub}"#遠程主機連接,生成密鑰sshpass -p${passwd} ssh $user@${head_ip}${ip} "ssh-keygen -t rsa -f ${base_dir}${key} -P ''"#遠程主機連接,將公鑰復制到其他主機認證文件for tmp_ip in ${arr[@]}do#安裝遠程連接工具sshpass -p${passwd} ssh $user@${head_ip}${ip} "yum install -y sshpass;"#遠程主機,將公鑰同步到其他機器sshpass -p${passwd} ssh $user@${head_ip}${ip} "sshpass -p${passwd} ssh-copy-id $user@${head_ip}${tmp_ip} -o StrictHostKeyChecking=no"#遠程主機,將公鑰同步localhost主機名下sshpass -p${passwd} ssh $user@${head_ip}${ip} "sshpass -p${passwd} ssh-copy-id $user@localhost -o StrictHostKeyChecking=no"donedoneecho -e "分發(fā)完結\n"}check_ip(){for ip in ${arr[@]}dopssh -H ${head_ip}${ip} -i $1done}bat(){echo "輸出ok:";check_ip 'echo "ok"'echo "輸出ping結果:";check_ip 'ping qq.com -c 2'echo "獲取主機名:";check_ip 'ls ~/.ssh'echo "獲取主機名:";check_ip "source /etc/profile;ip a | grep inet | grep ${head_ip}"}main(){install_cmd;create_key;bat}main





