20.31 expect脚本同步文件
同步文件使用的命令是rsync,和ssh是一样的,都需要输入密码。
脚本如下
#!/usr/bin/expect
set passwd "123456"
spawn rsync -av [email protected]:/tmp/12.txt /tmp/
expect {
"yes/no" { send "yes\r"; exp_continue}
"password:" { send "$passwd\r" }
}
expect eof
结果如下,exp_continue是必须的,expect eof也是必须的,甚至来说,如果时间过长,set timeout也要根据实际情况来设置。
root@lhy-server:~/shell_script# vim /root/.ssh/known_hosts
root@lhy-server:~/shell_script# ./expect4.sh
spawn rsync -av [email protected]:/tmp/12.txt /tmp/
The authenticity of host '192.168.0.109 (192.168.0.109)' can't be established.
ECDSA key fingerprint is SHA256:RGujPvieJX8G0MYV7PLypBodAkZ+M5RYrxMnFJeltNE.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.0.109' (ECDSA) to the list of known hosts.
[email protected]'s password:
receiving incremental file list
sent 20 bytes received 55 bytes 150.00 bytes/sec
total size is 5 speedup is 0.07
设置超时时间
#!/usr/bin/expect
set passwd "123456"
set timeout -1
spawn rsync -av [email protected]:/tmp/12.txt /tmp/
expect {
"yes/no" { send "yes\r"; exp_continue}
"password:" { send "$passwd\r" }
}
expect eof
设置为-1就是永不超时。但是,expect eof还是必需的。
20.32 expect脚本指定host和要同步的文件
脚本如下
#!/usr/bin/expect
set passwd "123456"
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
这里的file必须是绝对路径。
root@lhy-server:~/shell_script# chmod 700 expect5.sh
root@lhy-server:~/shell_script# ./expect5.sh 192.168.0.109 /tmp/12.txt
spawn rsync -av /tmp/12.txt [email protected]:/tmp/12.txt
[email protected]'s password:
sending incremental file list
sent 55 bytes received 12 bytes 134.00 bytes/sec
total size is 5 speedup is 0.07
如果想要同步多个文件
可以用循环,或者就是下一节的文件分发系统。
20.33 构建文件分发系统
• 需求背景
对于大公司而言,肯定时不时会有网站或者配置文件更新,而且使用的机器肯定也是好多台,少则几台,多则几十甚至上百台。所以,自动同步文件是至关重要的。
• 实现思路
首先要有一台模板机器,把要分发的文件准备好,然后只要使用expect脚本批量把需要同步的文件分发到目标机器即可。
• 核心命令
rsync -av --files-from=list.txt / root@host:/
文件列表里的路径必须为全局路径。
脚本如下
#!/usr/bin/expect
set 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
你不能保证对方机器上有相同的目录,就用-R选项。
list.txt路径
/tmp/12.txt
/root/shell_script/case1.sh
ip.txt
192.168.0.9
192.168.0.7
这样对方机器的密码必须一致,或者分别设置,最安全的还是密钥认证。
然后我们创建一个rsync.sh文件
#!/bin/bash
for ip in `cat ip.list`
do
echo $ip
./rsync.expect $ip list.txt
done
这样就能够给多台机器同步,脚本的意思大家理解一下,移植到自己的机器可以自行修改。
20.34 批量远程执行命令
传完文件之后,我们可能还需要执行重启服务的命令。
脚本如下
#!/usr/bin/expect
set host [lindex $argv 0]
set passwd "123456"
set cm [lindex $argv 1]
spawn ssh root@$host
expect {
"yes/no" { send "yes\r; exp_continue"}
"password:" { send "$passwd\r" }
}
expect "]*"
send "$cm\r"
expect "]*"
send "exit\r"
还要定义一个for循环脚本
#!/bin/bash
for ip in `cat ip.list`
do
echo $ip
./exe.expect $ip "w;free -m;ls /tmp"
done
相信大家很容易就能理解这部分的内容。
只要把expect语法搞清楚,这些都很简单。
扩展:
shell多线程