網站首頁 編程語言 正文
1. 前文
搭建了一套有多臺主機的局域網環境,不完全考慮安全性的情況下,為方便管理局域網內主機,配置SSH免密登錄,因主機較多,前陣子針對配置ssh免密和取消ssh免密功能單獨寫了腳本來自動化批量部署,現把兩個功能封裝在一起做成交互式程序
2.實現代碼
#!/bin/bash
#Author:cosann
#Version:0.2
#date:2022/7/27
#description:批量部署SSH免密登錄腳本
E_ERROR=65
#傳參檢測
if [ $# -ne 1 ]
then
echo -e "Usage:$0 ip_list_file "
exit E_ERROR
fi
#文件檢測
if [ ! -f "$1" ]
then
echo -e "IP_List_File $1文件異常,請檢查內容"
exit E_ERROR
fi
#初始化
ip_list_file=$1
#從文本讀取值初始化變量
ip_address=(`awk '{print $1}' $ip_list_file`)
username=(`awk '{print $2}' $ip_list_file`)
password=(`awk '{print $3}' $ip_list_file`)
#安裝軟件檢測及部署環境配置
echo -e "》》》開始檢測依賴的必須組件是否安裝》》》\n"
if [ `rpm -qa | grep "expect" &> /dev/null;echo $?` -ne 0 ]
then
echo -e "未安裝必須組件Expect,開始執行安裝,請稍等..."
( yum install -y expect &> /dev/null && echo -e ">Expect安裝完成!" ) || ( echo -e "部署必須組件Expect失敗,請檢查Yum配置" && exit E_ERROR )
elif [ `rpm -qa | grep "openssl" &> /dev/null;echo $?` -ne 0 ]
then
( yum install -y openssh &> /dev/null && echo -e ">Openssh安裝完成!" ) || ( echo -e "部署必須組件Openssh失敗,請檢查Yum配置" && exit E_ERROR )
elif [ `rpm -qa | grep "openssh-clients" &> /dev/null;echo $?` -ne 0 ]
then
( yum install -y openssh-clients &> /dev/null && echo -e ">Openssh-clients安裝完成!" ) || ( echo -e "部署必須組件Openssh-clients失敗,請檢查Yum配置" && exit E_ERROR )
else
echo -e ">必須組件Expect已安裝"
echo -e ">必須組件Openssh已安裝"
echo -e ">必須組件Openssh-clients已安裝"
fi
#打印菜單
echo -e "\n==============================================="
echo -e "該腳本可以實現批量部署和刪除SSH免密配置"
echo -e "Author:Cosann"
echo -e "Create time:2022/07/27"
echo -e "==============================================="
while :
do
echo -e ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
echo -e "1. 配置SHH免密登錄"
echo -e "2. 取消SHH免密配置"
echo -e "3. 退出程序"
#功能控制及實現
read -p "請輸入序號>>> " nu
if [[ "$nu" == "3" ]]
then
#退出程序
echo -e "\n###!!!感謝使用,再見!!!###"
exit 0
elif [[ "$nu" == "1" ]]
then
echo "開始推送"
#檢測公鑰文件是否存在,不存在則生成
if [ ! -e "$HOME/.ssh/id_rsa.pub" ];then
ssh-keygen -t rsa -P '' -f $HOME/.ssh/id_rsa
else
echo -e "》》》已創建公鑰文件,開始向遠端服務器推送公鑰》》》"
fi
#循環控制
count=`grep -v '^$' $ip_list_file | wc -l `
for (( i=0;i<$count;i++ ))
do
#echo -e "${ip_address[$i]}\t${username[$i]}\t${password[$i]}"
#自動化交互實現推送ssh公鑰
/usr/bin/expect<<-EOF
spawn ssh-copy-id -i $HOME/.ssh/id_rsa.pub ${username[$i]}@${ip_address[$i]}
expect {
"*yes/no" { send "yes\r";exp_continue }
"*password" { send "${password[$i]}\r" }
}
expect eof
EOF
done
echo -e "--------------------------------------------------------------------------------------"
echo -e "--------------------------------------------------------------------------------------"
echo -e "--------------------------------------------------------------------------------------"
echo -e "###推送完成,嘗試免密登錄###"
#推送公鑰成功免密結果通知
for (( i=0;i<$count;i++ ))
do
/usr/bin/expect<<-EOF
spawn ssh ${username[$i]}@${ip_address[$i]}
expect "*]#"
send "echo "##登錄成功##"\r"
expect "*]#"
send "exit\r"
EOF
done
echo -e "-------------------------------------------"
echo -e "已完成SHH免密配置,請嘗試SHH登錄遠端主機確認"
elif [[ "$nu" == "2" ]]
then
#自動化交互實現刪除配置免密的遠程主機上的authorized_keys
count=`grep -v '^$' $ip_list_file | wc -l `
for (( i=0;i<$count;i++ ))
do
/usr/bin/expect<<-EOF
spawn ssh ${username[$i]}@${ip_address[$i]}
expect "*]#"
send "rm -f /root/.ssh/authorized_keys 2> /dev/null\r"
expect "*]#"
send "exit\r"
EOF
done
echo -e "-------------------------------------------"
echo -e "已取消SHH免密配置,請嘗試SHH登錄遠端主機確認"
else
echo -e "\033[41;37m 非法輸入,請檢查輸入!!! \033[0m"
fi
done
3. 使用方法
3.1 使用前準備將代碼復制到腳本文件,賦予執行權限提前準備好IP地址用戶密碼文件
3.2 IP地址用戶密碼文件格式(注意!!!)
3.3 運行腳本
#腳本名 IP地址用戶密碼文件
#舉例
./ssh.sh host.txt #腳本會判斷調用腳本是否有指定IP地址用戶密碼文件,沒有的情況下會運行腳本失敗并提示
4. 使用注意
4.1 IP地址用戶密碼文件格式請按照以上圖示標準填寫,內容不正確時會出現等待ssh登錄或者重試的結果,這時候需要檢查配置文件的用戶名或者密碼是否錯誤
4.2 未在配置ssh免密的情況使用腳本,需要多次ctrl+c強制退出腳本
原文鏈接:https://blog.51cto.com/u_15538119/5518663
相關推薦
- 2021-11-27 在Docker容器中使用Arthas的詳細步驟_docker
- 2022-07-24 Redis中ServiceStack.Redis和StackExchange.Redis區別詳解_R
- 2022-10-14 C++ STL - list 模擬實現+解析迭代器
- 2022-11-08 詳解Python中數據處理的方法總結及實現_python
- 2023-03-29 react?Table準備Spin?Empty?ConfigProvider組件實現_React
- 2022-12-23 一文帶你搞懂Python中的文件操作_python
- 2022-07-23 C++深入淺出探索數據結構的原理_C 語言
- 2022-07-09 Android開發Dart?Constructors構造函數使用技巧整理_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支