shell(49) : 多个服务器批量设置相互免密

news/2025/2/5 14:02:04/

写在前面

  •  CentOS Linux release 7.9.2009 (Core)  系统已验证
  • 默认root账户, 其他账户无效
  • 创建[auto_mm.sh]必须vi创建文件然后粘贴

1.安装expect

1.1.在线安装

yum install -y tcl
yum install -y expect

1.2.离线安装(选其中一个即可)

1.2.1.在能联通公网的机器导出rpm包到不能联通公网的机器安装

参考 shell(30) : yum导出依赖包并离线安装_yum 导出包-CSDN博客

repotrack expect

1.2.2.百度网盘下载

待补充 ...

1.2.3.CSDN下载

待补充 ...

2.填下ip和密码信息(填好直接粘贴即可)

cat > ips <<'EOF'
192.168.1.1 abc123
192.168.1.2 abc123
EOF

若执行失败则创建ips文件, 填入以下内容

192.168.1.1 abc123
192.168.1.2 abc123

3.创建执行脚本 auto_mm.sh , 粘贴以下

#!/usr/bin/bash
path="$(cd "$(dirname "$0")" && pwd)"
cd $pathfunction info() {DATE_N=$(date "+%Y-%m-%d %H:%M:%S.%N" | cut -b 1-23)echo -e "$DATE_N|INFO|$@ "
}function warning() {DATE_N=$(date "+%Y-%m-%d %H:%M:%S.%N" | cut -b 1-23)echo -e "\033[33m$DATE_N|WARINIG|$@ \033[0m"
}function success() {DATE_N=$(date "+%Y-%m-%d %H:%M:%S.%N" | cut -b 1-23)echo -e "\033[32m$DATE_N|SUCCESS|$@ \033[0m"
}function error() {DATE_N=$(date "+%Y-%m-%d %H:%M:%S.%N" | cut -b 1-23)echo -e "\033[31m$DATE_N|ERROR|$@ \033[0m"exit
}cat >create_mm.sh <<'EOF'
ssh-keygen -t rsa -N '' <<EOF
/root/.ssh/id_rsa
yes\EOF
EOF
sed -i "s#\\\\\EOF#EOF#g" create_mm.shrm -rf auto_mm_mysif ! test -e ips; thenerror "[ips]文件不存在"
fiecho "-----------------[拉取公钥]-----------------"
while read line; doip=$(echo $line | awk '{print $1}')pass=$(echo $line | awk '{print $2}')# 创建ssh秘钥expect <<EOFspawn ssh root@$ip "ls /root/.ssh/id_rsa.pub |wc -l > /root/auto_mm_rs"expect {"yes/no" { send "yes\n";exp_continue}  "password" { send "$pass\n"}}expect eof
EOFexpect <<EOFspawn scp root@$ip:/root/auto_mm_rs ./expect {"yes/no" { send "yes\n";exp_continue} "password" { send "$pass\n"}}expect eof
EOFrs=$(cat auto_mm_rs)if [ $rs -eq 0 ]; thenwarning "$ip未创建ssh秘钥, 执行创建ssh秘钥"expect <<EOFspawn scp create_mm.sh root@$ip:/rootexpect {"yes/no" { send "yes\n";exp_continue} "password" { send "$pass\n"}}expect eof
EOFexpect <<EOFspawn ssh root@$ip "sh /root/create_mm.sh"expect {"yes/no" { send "yes\n";exp_continue} "password" { send "$pass\n"}}expect eof
EOFsleep 1sexpect <<EOFspawn ssh root@$ip "ls /root/.ssh/id_rsa.pub |wc -l > /root/auto_mm_rs"expect {"yes/no" { send "yes\n";exp_continue} "password" { send "$pass\n"}}expect eof
EOFexpect <<EOFspawn scp root@$ip:/root/auto_mm_rs ./expect {"yes/no" { send "yes\n";exp_continue} "password" { send "$pass\n"}}expect eof
EOFrs=$(cat auto_mm_rs)if [ $rs -eq 0 ]; thenerror "[$ip]ssh秘钥创建失败"elsesuccess "[$ip]ssh秘钥创建成功"fielsewarning "$ip已创建ssh秘钥"fi# 拉取ssh公钥expect <<EOFspawn scp root@$ip:/root/.ssh/id_rsa.pub ./expect {"yes/no" { send "yes\n";exp_continue} "password" { send "$pass\n"}}expect eof
EOFif ! test -e id_rsa.pub; thenerror "[$ip]ssh公钥拉取失败"ficat id_rsa.pub >>auto_mm_myssuccess "[$ip]拉取公钥成功"
done <ipsecho "-----------------[发送公钥]-----------------"
while read line; doip=$(echo $line | awk '{print $1}')pass=$(echo $line | awk '{print $2}')expect <<EOFspawn scp auto_mm_mys root@$ip:/rootexpect {"yes/no" { send "yes\n";exp_continue} "password" { send "$pass\n"}}expect eof
EOFexpect <<EOFspawn ssh root@$ip "cat /root/auto_mm_mys >> /root/.ssh/authorized_keys"expect {"yes/no" { send "yes\n";exp_continue} "password" { send "$pass\n"}}expect eof
EOF
done <ipsecho "-----------------[验证]-----------------"
cat >auto_mm_yz.sh <<'EOF'
function info() {DATE_N=$(date "+%Y-%m-%d %H:%M:%S.%N" | cut -b 1-23)echo -e "$DATE_N|INFO|$@ "
}function warning() {DATE_N=$(date "+%Y-%m-%d %H:%M:%S.%N" | cut -b 1-23)echo -e "\033[33m$DATE_N|WARINIG|$@ \033[0m"
}function success() {DATE_N=$(date "+%Y-%m-%d %H:%M:%S.%N" | cut -b 1-23)echo -e "\033[32m$DATE_N|SUCCESS|$@ \033[0m"
}function error() {DATE_N=$(date "+%Y-%m-%d %H:%M:%S.%N" | cut -b 1-23)echo -e "\033[31m$DATE_N|ERROR|$@ \033[0m"
}
EOFwhile read line; doip=$(echo $line | awk '{print $1}')pass=$(echo $line | awk '{print $2}')echo "ssh $ip -o PreferredAuthentications=publickey -o StrictHostKeyChecking=no \"date\" > /dev/null 2>&1" >>auto_mm_yz.shcat >>auto_mm_yz.sh <<'EOF'
if [ $? -eq 0 ]; then
EOFecho "    success \"[local_ip] ====> [$ip]设置免密成功\"" >>auto_mm_yz.shecho "else" >>auto_mm_yz.shecho "    warning \"[local_ip] ====> [$ip]设置免密失败\"" >>auto_mm_yz.shecho "fi" >>auto_mm_yz.sh
done <ips
sed -i "s#local_ip#\$1#g" auto_mm_yz.shcat > yz.sh <<'EOF'
#!/usr/bin/bashfunction info() {DATE_N=$(date "+%Y-%m-%d %H:%M:%S.%N" | cut -b 1-23)echo -e "$DATE_N|INFO|$@ "
}function warning() {DATE_N=$(date "+%Y-%m-%d %H:%M:%S.%N" | cut -b 1-23)echo -e "\033[33m$DATE_N|WARINIG|$@ \033[0m"
}function success() {DATE_N=$(date "+%Y-%m-%d %H:%M:%S.%N" | cut -b 1-23)echo -e "\033[32m$DATE_N|SUCCESS|$@ \033[0m"
}function error() {DATE_N=$(date "+%Y-%m-%d %H:%M:%S.%N" | cut -b 1-23)echo -e "\033[31m$DATE_N|ERROR|$@ \033[0m"
}function yz() {ssh $1 -o PreferredAuthentications=publickey -o StrictHostKeyChecking=no "date" >/dev/null 2>&1if [ $? -eq 0 ]; thensuccess "=================[$1]配置免密成功================="info "验证【[$1]】对所有服务器的免密配置"scp auto_mm_yz.sh root@$1:/rootssh root@$1 "sh /root/auto_mm_yz.sh $1"elsewarning "=================[$1]配置免密失败================="expect <<EOFspawn scp auto_mm_yz.sh root@$1:/rootexpect {"yes/no" { send "yes\n";exp_continue} "password" { send "$2\n"}}expect eof
\EOFinfo "验证【[$1]】对所有服务器的免密配置"expect <<EOFspawn ssh root@$1 "sh /root/auto_mm_yz.sh $1"expect {"yes/no" { send "yes\n";exp_continue} "password" { send "$2\n"}}expect eof
\EOFfi
}EOF
sed -i "s#\\\\\EOF#EOF#g" yz.shwhile read line; doip=$(echo $line | awk '{print $1}')pass=$(echo $line | awk '{print $2}')echo "yz $ip $pass" >> yz.sh
done <ipssh yz.sh# 清理
rm -rf auto_mm_mys
rm -rf auto_mm_rs
rm -rf auto_mm_yz.sh
rm -rf create_mm.sh
rm -rf id_rsa.pub
rm -rf yz.sh

4.执行脚本

sh auto_mm.sh


http://www.ppmy.cn/news/1271174.html

相关文章

selenium+xpath爬取二手房标题

贝壳找房标题爬取需要注意的是&#xff0c;在页面中间有一个小广告 而他就在ul的li下面&#xff0c;当我们进行title所以输出时&#xff0c;会报错。 所以在进行页面解析之前必须把广告叉掉&#xff0c;不然也把广告那一部分的li给爬取下来了 所以&#xff0c;我们&#xff0…

使用 TensorFlow 创建生产级机器学习模型(基于数据流编程的符号数学系统)——学习笔记

资源出处&#xff1a;初学者的 TensorFlow 2.0 教程 | TensorFlow Core (google.cn) 前言 对于新框架的学习&#xff0c;阅读官方文档是一种非常有效的方法。官方文档通常提供了关于框架的详细信息、使用方法和示例代码&#xff0c;可以帮助你快速了解和掌握框架的使用。 如…

Golang在 Docker 中交叉编译 Windows

前言&#xff1a; 前端时间把本地的 Golang 开发环境卸载了&#xff0c;如果编写代码的话就是启动一个 Golang 的 Docker 容器。这样做对于服务端开发本来也是没有问题的&#xff0c;但是有时候想要把程序放到 Windows 上面来执行&#xff0c;那就遇到麻烦了。因为 Docker 容器…

vscode的文件和文件夹的警告标志如何消去

由于平时用vscode写一些java的小demo, 但是这个vscode的警告和错误管理很奇怪, 这个警告信息会显示在这个侧边的文件和文件夹中, 我上网上找能不能把这个给去掉的办法, 找了半天没找到。 于是我就自己去查了一下这个vscode的设置, 真让我找到了这方面的开关, 把下面的这个关闭…

【离线】牛客小白月赛39 G

登录—专业IT笔试面试备考平台_牛客网 题意 思路 考虑离线Bit做法 这种离线Bit&#xff0c;一般都是去考虑二维数点就能写清楚了 确定好两维&#xff1a;x 轴是1 ~ n&#xff0c; y 轴是 k 的大小 然后去遍历值域&#xff0c;如果值域很大的话需要排序离散化&#xff0c;但…

uni-app微信小程序隐藏左上角返回按钮

官方文档链接&#xff1a;uni.setNavigationBarTitle(OBJECT) | uni-app官网 (dcloud.net.cn) 首先要明确的是页面间的跳转方式有几种、每一种默认的作用是什么。 uniapp五种跳转方式 第一&#xff1a;wx.navigatorTo 【新页面打开&#xff0c;默认会有返回按钮】第二&#x…

PyQt6 使用Qt Designer实现简单的界面,以及ui文件转py文件

前言&#xff0c;主要通过参考并总结两篇文章中的部分内容&#xff0c;参考文章一 && 参考文章二 Qt 设计师简单例子 一、需求分析二、界面设计三、生成ui文件四、ui文件转py文件1、命令行 执行 uic 生成 py代码2、PyCharm 配置 Pyuic工具2.1 配置Pyuic工具2.2 测试是否…

四十七、Redis分片集群

目录 一、分片集群结构 二、散列插槽 1、Redis如何判断某个key应该在哪个实例&#xff1f; 2、如何将同一类数据固定的保存在同一个Redis实例&#xff1f; 三、集群伸缩 四、故障转移 1、当集群中有一个master宕机时 &#xff08;1&#xff09;自动转移 &#xff08;2&…