20.31 expect脚本同步文件
20.32 expect脚本指定host和要同步的文件
20.33 构建文件分发系统
20.34 批量远程执行命令
20.31 expect脚本同步文件
实例4.自动同步文件
编辑脚本
1 | [root@kun05 sbin]# vim expect4.exp |
写入下面代码1
2
3
4
5
6
7
8#!/usr/bin/expect
set passwd "coco0769"
spawn rsync -av root@192.168.80.102:/tmp/test.aa /tmp/
expect {
"yes/no" {send "yes\r"}
"password:" {send "$passwd\r"}
}
expect eof
测试
添加执行权限并执行脚本
1 | [root@kun05 sbin]# chmod a+x expect4.exp |
已经把192.168.80.102的test.aa文件自动同步过来本机了
20.32 expect脚本指定host和要同步的文件
实例5.指定host和同步单个文件
编辑脚本
1 | [root@kun05 sbin]# vim expect5.exp |
写入下面代码1
2
3
4
5
6
7
8
9
10#!/usr/bin/expect
set passwd "coco0769"
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
测试
添加执行权限并执行脚本
1 | [root@kun05 sbin]# chmod a+x expect5.exp |
20.33 构建文件分发系统
分发系统中首先用expect编写远程同步脚本
并指定文件列表
和目标IP列表
然后使用shell脚本
调用expect来同步文件。
这里每台机器必须使用同样的密码才可以同步,也可以让机器之前使用密钥
登录。还有让每台机器都安装上rsync
其核心命令为rsync -av --files-from=list.txt / root@host:/
1.编辑expect脚本
1 | [root@kun05 sbin]# vim rsync.exp |
写入下面代码1
2
3
4
5
6
7
8
9
10
11#!/usr/bin/expect
set passwd "coco0769"
set host [lindex $argv 0]
set file [lindex $argv 1]
#--file-from指定文件列表路径 -R表示同步时目标会级联创建目录
spawn rsync -avR --files-from=$file / root@$host:/
expect {
"yes/no" {send "yes\r"}
"password:" {send $passwd\r}
}
expect eof
2.创建ip.list 同步机器的IP列表
1 | [root@kun05 sbin]# vim /tmp/ip.list |
3.创建file.list 需要同步文件的列表
1 | [root@kun05 sbin]# vim /tmp/file.list |
4.创建 rsync.sh 脚本
1 | [root@kun05 sbin]# vim rsync.sh |
写入下面代码1
2
3
4
5#!/bin/bash
for i in `cat /tmp/ip.list`
do
./rsync.exp $i /tmp/file.list
done
测试
添加执行权限并执行脚本
1 | [root@kun05 sbin]# chmod a+x rsync.exp |
20.34 批量远程执行命令
当同步完代码后有可能需要批量地重启服务,因此还需要批量远程执行命令,类似于自动化。
这里是用expect编写执行命令的脚本并用shell脚本来批量调用它。
1.编辑expect脚本
1 | [root@kun05 sbin]# vim exe.exp |
写入下面代码1
2
3
4
5
6
7
8
9
10
11
12
13#!/usr/bin/expect
set passwd "coco0769"
set host [lindex $argv 0]
set cmd [lindex $argv 1]
spawn ssh root@$host
expect {
"yes/no" {send "yes\r"}
"password:" {send "$passwd\r"}
}
expect "]*"
send "$cmd\r"
expect "]*"
send "exit\r"
2.编写shell脚本
1 | [root@kun05 sbin]# vim exe.sh |
写入下面代码1
2
3
4
5
6#!/bin/bash
for i in `cat /tmp/ip.list`
do
echo $i
./exe.exp $i "service nginx restart"
done
测试
添加执行权限并执行脚本
1 | [root@kun05 sbin]# chmod a+x exe.exp |
这里kun03和kun04机器都执行了service nginx restart
命令