批量远程执行命令

在一台机器上远程到多台机器上执行多条命令,怎么实现呢?

写一个登录到多台机器并执行命令的脚本文件remote-exec-command.sh

vim /usr/local/sbin/expect/remote-exec-command.sh
#!/usr/bin/expect
set host [lindex $argv 0]
set command [lindex $argv 1]
set user "root"
set passwd "root"
spawn ssh $user@$host
expect {
"yes/no" {send "yes\r";exp_continue}
"password:" {send "$passwd\r"}
}
expect "]*"
send "$command\r"
expect "]*"
expect eof

写一个远程机器的ip列表集合文件

vim /tmp/desip.txt
192.168.221.20
192.168.221.30

写一个调用remote-exec-command.sh这个脚本的文件exec.sh

vim /usr/local/sbin/expect/exec.sh
#!/bin/bash

for ip in `cat /tmp/desip.txt`; do
        ./remote-exec-command.sh $ip "who;ifconfig"
done

执行exec.sh

[root@localhost expect]# bash exec.sh 
spawn ssh root@192.168.221.20
root@192.168.221.20's password: 
Last login: Sun Mar 18 16:47:04 2018 from 192.168.221.10
[root@apenglinux-002 ~]# who;ifconfig
root     tty1         2018-03-03 10:46
root     pts/0        2018-03-18 13:29 (192.168.221.10)
root     pts/1        2018-03-18 10:01 (192.168.221.1)
root     pts/2        2018-03-18 16:59 (192.168.221.10)
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.221.20  netmask 255.255.255.0  broadcast 192.168.221.255
        inet6 fe80::5d25:422c:6b81:44f6  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:d3:03:2c  txqueuelen 1000  (Ethernet)
        RX packets 18903  bytes 1403073 (1.3 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 18097  bytes 3892662 (3.7 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)
        RX packets 72  bytes 5776 (5.6 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 72  bytes 5776 (5.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@apenglinux-002 ~]# spawn ssh root@192.168.221.30
root@192.168.221.30's password: 
Last login: Sun Mar 18 16:47:15 2018 from 192.168.221.10
[root@apenglinux-002 ~]# who;ifconfig
root     pts/0        2018-03-18 15:45 (192.168.221.1)
root     pts/1        2018-03-18 17:00 (192.168.221.10)
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.221.30  netmask 255.255.255.0  broadcast 192.168.221.255
        inet6 fe80::52c5:3f9d:6d2b:445a  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:34:2f:3a  txqueuelen 1000  (Ethernet)
        RX packets 17781  bytes 16618859 (15.8 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 12771  bytes 903704 (882.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)
        RX packets 688  bytes 174164 (170.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 688  bytes 174164 (170.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0