shell案例分发系统
一、expect
expect可以让我们实现自动登录远程机器,并且可以实现自动远程执行命令。当然若是使用不带密码的密钥验证同样可以实现自动登录和自动远程执行命令。但当不能使用密钥验证的时候,我们就没有办法了。所以,这时候只要知道对方机器的账号和密码就可以通过expect脚本实现登录和远程命令。脚本后缀为.expect
安装expect:yum install -y expect
1、自动远程登录,并执行命令
首先来看一个登录后不退出的脚本:
#!/usr/bin/expect
set host "192.168.0.117"
set passwd "123456"
spawn ssh root@$host
expect {"yes/no" { send "yes\r"; exp_continue }
"assword:" { send "$passwd\r" }
}
interact
再来看一个登录后,执行命令在再退出
#!/usr/bin/expect
set user "root"
set host "192.168.0.117"
set passwd "123456"
spawn ssh $user@$host
expect {
"yes/no" { send "yes\r"; exp_continue }
"assword:" { send "$passwd\r" }
}
expect "]*"
send "touch /tmp/12.txt\r"
expect "]*"
send "echo 1212 > /tmp/12.txt\r"
expect "]*"
send "exit\r"
2、传递参数
#!/usr/bin/expect
#分别定义三个参数user、host、cm,其实passwd也可以改成参数
set user [lindex $argv 0]
set host [lindex $argv 1]
set passwd "123456"
set cm [lindex $argv 2]
spawn ssh $user@$host
expect {
"yes/no" { send "yes\r"; exp_continue }
"assword:" { send "$passwd\r" }
}
expect "]*"
send "$cm\r"
expect "]*"
send "exit\r"
执行:./3.expect root 192.168.0.117 "ls /tmp/21.txt"
3、自动同步文件
#!/usr/bin/expect
set passwd "123456"
spawn rsync -av root@192.168.0.117:/tmp/21.txt /tmp/
expect {
"yes/no" { send "yes\r" }
"assword:" { send "$passwd\r" }
}
#指定结束符,否则不会执行前面的命令
expect eof
4、指定host和要同步的文件
#!/usr/bin/expect
set p#!/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" }
"assword:" { send "$passwd\r" }
}
expect eof
执行:./5.expect 192.168.0.117 /tmp/21.txt
二、构建文件分发系统
1、需求背景
对于大公司,当网站或者配置文件更新,而且使用的机器肯定数量很多,少则几台,多则几十甚至上百台,所以,自动同步文件时至关重要的。
2、实现思路
首先要有一台 模板机器,把要分发的文件准备好,然后只要使用expect脚本批量把需要同步的文件分发到目标机器即可。
3、核心命令
rysnc -av --files-from=list.txt / root@host:/
4、文件分发系统的实现
主机ip全部列入ip.txt,需要同步的文件列入 list.text
编写rsync.expect
#!/usr/bin/expect
set p#!/usr/bin/expect
set passwd "123456"
set host [lindex $argv 0]
set file [lindex $argv 1]
spawn rsync -av --files-from=$file / root@$host:/
expect {
"yes/no" { send "yes\r" }
"assword:" { send "$passwd\r" }
}
expect eof
编写 rsync.sh
#!/bin/bash
#需要保证rsync.expect在同一目录下,且有执行权限
for ip in `cat ip.list`
do
echo $ip
./rsync.expect $ip list.txt
done
5、命令批量执行脚本
vim exe.expect
#!/usr/bin/expect
set passwd "123456"
set host [lindex $argv 0]
set cm [lindex $argv 1]
spawn ssh root@$host
expect {
"yes/no" { send "yes\r" }
"assword:" { send "$passwd\r" }
}
expect "]*"
send "$cm\r"
expect "]*"
send "exit\r"
vi exe.sh
#!/bin/bash
for ip in `cat ip.list`
do
echo $ip
./exe.expect $ip "w;free -m;ls /tmp"
done