20.31 expect脚本同步文件

  • 自动同步文件
#!/usr/bin/expect
set passwd "rootroot"
spawn rsync -av root@192.168.0.132:/tmp/12.txt /tmp/
expect {
"yes/no" { send "yes\r"}
"password:" { send "$passwd\r"}
}
expect eof

执行

[root@qingyun-01 sbin]# ./4.expect 
spawn rsync -av root@192.168.0.132:/tmp/12.txt /tmp/
root@192.168.0.132's password: 
receiving incremental file list
12.txt

sent 30 bytes  received 84 bytes  228.00 bytes/sec
total size is 5  speedup is 0.04
[root@qingyun-01 sbin]# ls /tmp/
12.txt

20.32 expect脚本指定host和要同步的文件

  • 指定host和要同步的文件
#脚本内容

#!/usr/bin/expect
set passwd "rootroot"
set host [lindex $argv 0]
set file [lindex $argv 1]
spawn rsync -av $file root@$host:$file
expect {
"yes/no" { send "yes\r"}
"password:" { send "$passwd\r"}
}
expect eof

执行

[root@qingyun-01 sbin]# vim 5.expect
[root@qingyun-01 sbin]# chmod a+x 5.expect 
[root@qingyun-01 sbin]# ./5.expect 192.168.0.132 "/tmp/12.txt"
spawn rsync -av /tmp/12.txt root@192.168.0.132:/tmp/12.txt
root@192.168.0.132's password: 
sending incremental file list

sent 31 bytes  received 12 bytes  86.00 bytes/sec
total size is 5  speedup is 0.12
#本脚本适合同步一个文件
#只把本地的12.txt同步到远程

20.33 构建文件分发系统

  • 需求背景
    对于大公司而言,肯定时不时会有网站或者配置文件更新,而且使用的机器肯定也是好多台,少则几台,多则几十甚至上百台。所以,自动同步文件是至关重要的。
  • 实现思路
    首先要有一台模板机器,把要分发的文件准备好,然后只要使用expect脚本批量把需要同步的文件分发到目标机器即可。
  • 核心命令
rsync -av --files-from=list.txt / root@host:/
  • 文件分发系统的实现
#rsync.expect内容

#!/usr/bin/expect
set passwd "rootroot"
set host [lindex $argv 0]
set file [lindex $argv 1]
spawn rsync -avR $file root@$host:$file
#如果不确定远程路径可以 加选项 -R
#来创建路径

expect {
"yes/no" { send "yes\r"}
"password:" { send "$passwd\r"}
}
expect eof

#创建一个文件存放文件列表
[root@qingyun-01 sbin]# cat /tmp/file.list 
/tmp/12.txt
/tmp/1/2/1.txt
/tmp/2/2.txt
  • ip.list内容
[root@qingyun-01 sbin]# vim /tmp/ip.list

192.168.0.132
127.0.0.1
......
  • rsync.sh 内容
#!/bin/bash
for ip in `cat /tmp/ip.list`
do
    echo $ip
    ./rsync.expect $ip /tmp/file.list
done

执行结果

[root@qingyun-01 sbin]# sh -x rsync.sh
++ cat /tmp/ip.list
+ for ip in '`cat /tmp/ip.list`'
+ echo 192.168.0.132
192.168.0.132
+ ./rsync.expect 192.168.0.132 /tmp/file.list
spawn rsync -avR --files-from=/tmp/file.list / root@192.168.0.132:/
root@192.168.0.132's password: 
building file list ... done

sent 143 bytes  received 12 bytes  310.00 bytes/sec
total size is 5  speedup is 0.03
+ for ip in '`cat /tmp/ip.list`'
+ echo 127.0.0.1
127.0.0.1
+ ./rsync.expect 127.0.0.1 /tmp/file.list
spawn rsync -avR --files-from=/tmp/file.list / root@127.0.0.1:/
root@127.0.0.1's password: 
building file list ... done

sent 143 bytes  received 12 bytes  310.00 bytes/sec
total size is 5  speedup is 0.03

#注意:增加执行权限 chmod a+x 文件名

#结果
[root@qingyun-01 sbin]# ./1.expect 
spawn ssh root@192.168.0.132
root@192.168.0.132's password: 
Last login: Wed Feb 28 22:53:45 2018 from 192.168.0.130
[root@qingyun-02 ~]# ls /tmp/
1
12.txt
2
2.txt

[root@qingyun-02 ~]# ls /tmp/2/
2.txt

20.34 批量远程执行命令

  • exe.expect 内容
#!/usr/bin/expect
set host [lindex $argv 0]
set passwd "rootroot"
set cm [lindex $argv 1]
spawn ssh root@$host
expect {
"yes/no" { send "yes\r"}
"password:" { send "$passwd\r" }
}
expect "]*"
send "$cm\r"
expect "]*"
send "exit\r"
  • exe.sh 内容
#!/bin/bash
for ip in `cat /tmp/ip.list`
do
    echo $ip
    ./exe.expect $ip "w;free -m;ls /tmp"
done

执行过程&结果

[root@qingyun-01 sbin]# vi exe.expect
[root@qingyun-01 sbin]# vi exe.sh
[root@qingyun-01 sbin]# chmod a+x exe.expect ;chmod a+x exe.sh;
[root@qingyun-01 sbin]# sh -x exe.sh 
++ cat /tmp/ip.list
+ for ip in '`cat /tmp/ip.list`'
+ echo 192.168.0.132
192.168.0.132
+ ./exe.expect 192.168.0.132 'w;free -m;ls /tmp'
spawn ssh root@192.168.0.132
root@192.168.0.132's password: 
Last login: Wed Feb 28 23:09:45 2018 from 192.168.0.130
[root@qingyun-02 ~]# w;free -m;ls /tmp
 23:19:26 up  2:27,  2 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.0.4      20:53    1:45m  0.06s  0.06s -bash
root     pts/1    192.168.0.130    23:19    1.00s  0.01s  0.00s w
              total        used        free      shared  buff/cache   available
Mem:           1823          96        1465           8         261        1555
Swap:          2047           0        2047
1
12.txt
2
2.txt
systemd-private-f76127fe2f6b440a98fd57cb13173406-chronyd.service-lcHZr0
systemd-private-f76127fe2f6b440a98fd57cb13173406-vgauthd.service-HtFYwp
systemd-private-f76127fe2f6b440a98fd57cb13173406-vmtoolsd.service-rAX6FO
yum_save_tx.2018-02-28.20-58.xdulyV.yumtx
yum_save_tx.2018-02-28.21-03.8mtfU5.yumtx
[root@qingyun-02 ~]# + for ip in '`cat /tmp/ip.list`'
+ echo 127.0.0.1
127.0.0.1
+ ./exe.expect 127.0.0.1 'w;free -m;ls /tmp'
spawn ssh root@127.0.0.1
root@127.0.0.1's password: 
Last failed login: Wed Feb 28 23:04:17 CST 2018 from 127.0.0.1 on ssh:notty
There were 2 failed login attempts since the last successful login.
Last login: Wed Feb 28 20:53:17 2018 from 192.168.0.4
[root@qingyun-01 ~]# w;free -m;ls /tmp
 23:19:28 up  2:27,  2 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.0.4      20:53    8.00s  0.42s  0.00s /usr/bin/expect ./exe.expect
root     pts/2    127.0.0.1        23:19    0.00s  0.02s  0.00s w
              total        used        free      shared  buff/cache   available
Mem:           1823          99        1426           8         296        1550
Swap:          2047           0        2047
1       file.list
12.txt  ip.list
1.txt   systemd-private-2c7c3aa47d8f4e789cecfdb3a9fab54c-chronyd.service-2qG20X
2       systemd-private-2c7c3aa47d8f4e789cecfdb3a9fab54c-vgauthd.service-BmrrqI
2.txt   systemd-private-2c7c3aa47d8f4e789cecfdb3a9fab54c-vmtoolsd.service-Pkezae