课程名称:20.31 expect脚本同步文件
笔记内容:
自动同步文件
[root@localhost sbin]# vim 4.expect
#!/usr/bin/expect
set passwd "123456"
spawn rsync -av root@192.168.133.132:/tmp/12.txt /tmp/
expect {
"yes/no" { send "yes\r"}
"password:" { send "$passwd\r" }
}
expect eof
[root@localhost sbin]# chmod a+x 4.expect
反面案例:
注:如果注释掉expect eof或者没这条就会没有传输就退出来
并且设定运行时间也是无意义的
#!/usr/bin/expect
set passwd "123456"
spawn rsync -av root@1.1.1.1:/tmp/12.txt /tmp/
set timeout 20
expect {
"yes/no" { send "yes\r"}
"password:" { send "$passwd\r" }
}
#expect eof(必须要有)
课程名称:20.32 expect脚本指定host和要同步的文件
笔记内容:
[root@localhost sbin]# vim 6.expect
#!/usr/bin/expect
set passwd "123456"
set host [lindex $argv 0]
set file [lindex $argv 1] (file同步的文件,要写绝对路径)
spawn rsync -av $file root@$host:$file (本机到对方)
expect {
"yes/no" { send "yes\r"}
"password:" { send "$passwd\r" }
}
expect eof
[root@localhost sbin]# chmod a+x 6.expect
只适合同步一个文件,本机同步到远程服务器
[root@localhost sbin]# ./6.expect 172.25.200.192 "/tmp/mysql.sock"
课程名称:20.33 构建文件分发系统
笔记内容:
需求背景
对于大公司而言,肯定时不时会有网站或者配置文件更新,而且使用的机器肯定也是好多台,少则几台,多则几十甚至上百台。所以,自动同步文件是至关重要的。
实现思路
首先要有一台模板机器,把要分发的文件准备好,然后只要使用expect脚本批量把需要同步的文件分发到目标机器即可。
核心命令
rsync -av --files-from=list.txt / root@host:/
注:list.txt需要同步文件的文件列表,当文件量大时,--files-from就可以把文件列表中文件全部同步,文件列表中的文件路径必须是绝对路径,并且同步文件的路径对端服务器也必须要有(如果没有可以-R自动创建)
文件分发系统的实现
首先 rsync.expect内容
[root@localhost sbin]# vim rsync.expect
#!/usr/bin/expect
set passwd "123456"
set host [lindex $argv 0]
set file [lindex $argv 1] (file指文件列表)
spawn rsync -Rav --files-from=$file / root@$host:/ (原目录时根目标也是根)
expect {
"yes/no" { send "yes\r"}
"password:" { send "$passwd\r" }
}
expect eof
[root@localhost sbin]# chmod a+x rsync.expect
然后list.txt 文件列表(定义file)
[root@localhost sbin]# vim /tmp/list.txt
还需要ip.list (远程同步的服务器不止一台)
[root@localhost sbin]# vim /tmp/ip.list
这里必须所有服务器的密码都是一致的,所以最好做密钥认证这样就不需要输入密码,而且很多都是密码不相同需要输密码
创建脚本rsync.sh (遍历下IP地址)
[root@localhost sbin]# vim rsync.sh
#!/bin/bash
for ip in `cat /tmp/ip.list`
do
echo $ip
./rsync.expect $ip /tmp/list.txt
done
课程名称:20.34 批量远程执行命令
笔记内容:
自动化批量执行命令
[root@localhost sbin]# vim exe.expect
#!/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"}
"password:" { send "$passwd\r" }
}
expect "]*"
send "$cm\r"
expect "]*"
send "exit\r"
[root@localhost sbin]# chmod a+x exe.expect
定义exe.sh脚本
[root@localhost sbin]# vim exe.sh
#!/bin/bash
for ip in `cat /tmp/ip.list`
do
echo $ip
./exe.expect $ip "w;free -m;ls /tmp"
done