假设你有一堆机器需要运维,并且都要执行相同的操作,那么你会怎么做呢?一个个ssh上去执行命令或是做成一个脚本挨个执行吗?这样效率太低啦,于是有了这个批量执行ssh运行命令的骚操作

准备

本文建立在你从未ssh连接过这些机器,并且他们都配置好了网络(自动获取ip或是固定ip)
首先需要sshpass用来批量填写ssh密码,如果这堆机器都是同一个虚拟机模板复制出来的,密码都是一样的,那就更好办了
还可以装一下nmap用来扫描需要连接的机器的ip,或者需要一个ip对应用户密码的台账

扫描192.168.100.1192.168.100.254整个网段开了22端口的机器ip

nmap -sS 192.168.100.1/24 -p 22 -T 5 -open | grep 192.168.100. | awk '{print($5)}'

这样就得到了一个ip清单

执行命令

简单的说就是这样的:

sshpass -p ssh的密码 ssh -o StrictHostKeyChecking=no ssh用户名@ip地址 要运行的命令

其中StrictHostKeyChecking就是为了跳过初次连接ssh时显示证书要求yes同意的那个询问

那和上面的nmap串起来,就得到了下面这条命令,就可以自动扫描这个网段并自动在每台机上执行了

nmap -sS 192.168.100.1/24 -p 22 -T 5 -open | grep 192.168.100. | awk '{system("sshpass -p ssh的密码 ssh -o StrictHostKeyChecking=no ssh用户名@"$5" 要运行的命令")}'

或者写一个脚本就好了,把下面的内容贴到比如batchSSH.sh文件中

cat << EOF | awk '{print($1, system("sshpass -p "$1" ssh -o StrictHostKeyChecking=no "$2" '"$*"'"))}'
密码1 用户名1@ip1
密码2 用户名2@ip2
EOF

这时候运行sh batchSSH.sh 要运行的命令就会在每一台机上执行了

如果你的用户名和密码都一样,那就这样,正好可以把上面nmap扫的ip贴进来

cat << EOF | awk '{print($1, system("sshpass -p 密码 ssh -o StrictHostKeyChecking=no 用户名@"$1" '"$*"'"))}'
服务器ip1
服务器ip2
EOF

要是不放心,可以把system删掉输出命令看看