9.25任务

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多线程

转载于:https://my.oschina.net/u/3866688/blog/2209624

你可能感兴趣的:(9.25任务)