expect脚本同步文件
#!/usr/bin/expectset passwd "1"spawn rsync -av root@192.168.65.130:/tmp/12.txt /tmp/expect {"yes/no" { send "yes\r"}"password:" { send "$passwd\r" }}expect eof// expect eof会给予一定的时间让你进行操作// 如果没有加expect eof,将导致同步没执行就断开连接,这样是不对的
expect脚本指定host和要同步的文件
#!/usr/bin/expectset passwd "1"set host [lindex $argv 0]set file [lindex $argv 1] // 这里只适合同步1个文件spawn rsync -av $file root@$host:$fileexpect {"yes/no" { send "yes\r"}"password:" { send "$passwd\r" }}expect eof
执行
./5.expect 192.168.65.130 /tmp/12.txt
可以通过set timeout来指定超时时间,-1表示永不超时,5表示超时间时间为5s
构建分发系统
需求:生产环境下,需要一次同步多个文件,之前的那个代码显然不足以实现功能
核心命令:rsync -av --files-from=list.txt / root@host:/
/usr/local/sbin/rsync.expect脚本如下:
#!/usr/bin/expectset passwd "123456"set host [lindex $argv 0]set file [lindex $argv 1]spawn rsync -avR --files-from=$file / root@$host:/expect {"yes/no" { send "yes\r"}"password:" { send "$passwd\r" }}expect eof
/tmp/file.list内容如下:
#其实质为所需同步的各个文件的绝对路径/tmp/12.txt/tmp/2.txt/root/1.sh
/tmp/ip.list文件内容
# 要执行的服务器ip,这里要求密码是相同的;但是这样有安全隐患# 可以使用秘钥认证来登录,秘钥可以一致192.168.65.130192.168.65.131192.168.65.132
/usr/local/sbin/rsync.sh
#!/bin/bashfor ip in `cat /tmp/ip.list`do echo $ip ./usr/local/sbin/rsync.expect $ip /tmp/file.listdone
最后执行/usr/local/sbin/rsync.sh即可
脚本、文件说明
/usr/local/sbin/rsync.expect基本执行的是远程主机同步文件的功能,它会一次性同步多个文件;文件列表在/tmp/file.list内;/usr/local/sbin/rsync.sh通过循环遍历ip.list内的要进行同步命令的主机,来循环执行rsync.expect脚本,这样最终实现多主机多文件同步功能!
批量远程执行命令
向之前批量同步文件功能类似,我们可以实现批量远程执行命令
/usr/local/sbin/exe.expect
#!/usr/bin/expectset host [lindex $argv 0]set passwd "1"set cm [lindex $argv 1]spawn ssh root@$hostexpect {"yes/no" { send "yes\r"}"password:" { send "$passwd\r" }}expect "]*"send "$cm\r"expect "]*"send "exit\r"
/usr/local/sbin/exe.sh
#!/bin/bashfor ip in `cat /tmp/ip.list`do echo $ip ./exe.expect $ip "w;free -m;ls /tmp"done
执行exe.sh即可实现批量命令执行