37 分发系统

expect分发
yum install -y expect
1.自动远程登陆shell

#! /usr/bin/expect
set host "192.168.133.132"  //定义变量host
set passwd "123456"
spawn ssh root@$host  //spawn后面跟系统shell命令,远程登陆
expect {
"yes/no" { send "yes\r"; exp_continue}  //初次登陆机器会提示yes/no,再次登陆不会是由于/root/.ssh/known_hosts有记录。表示有yes/no时,作括号中动做,exp_continue表示继续
"password:" { send "$passwd\r" }
}
interact  //保持登陆在机器上,若用expect eof,则停留一下子退出

须要给文件执行权限bash

2.自动远程登陆后,执行命令并退出ssh

#!/usr/bin/expect
set user "root"
set passwd "123456"
spawn ssh $user@192.168.133.132

expect {
"yes/no" { send "yes\r"; exp_continue}
"password:" { send "$passwd\r" }
}
expect "]\*"  //表示命令行前的部分,PS1的最后部分root用户是]#,普通用户是]$,所以须要通配
send "touch /tmp/12.txt\r"
expect "]\*"
send "echo 1212 > /tmp/12.txt\r"
expect "]\*"
send "exit\r"  //退出

3.传递参数ide

#!/usr/bin/expect

set user [lindex $argv 0]  //定义变量user值为参数1
set host [lindex $argv 1]  //参数2
set passwd "123456"
set cm [lindex $argv 2]  //参数3,发送的多条命令用分号隔开,命令执行时间不能太长,expect会有超时时间,默认10s。也能够自行设置:set timeout [number] 单位s,设定-1表示不限时间
spawn ssh $user@$host

expect {
"yes/no" { send "yes\r"}
"password:" { send "$passwd\r" }
}
expect "]\*"
send "$cm\r"
expect "]\*"
send "exit\r"

4.自动同步文件 网站

#!/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  //不加这个会登陆后当即退出致使根本没同步

5.指定host和要同步的文件spa

#!/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

6.构建文件分发系统
需求背景:对于大公司而言,确定时不时会有网站或者配置文件更新,并且使用的机器确定也是好多台,少则几台,多则几十甚至上百台。因此,自动同步文件是相当重要的。
实现思路:首先要有一台模板机器,把要分发的文件准备好,而后只要使用expect脚本批量把须要同步的文件分发到目标机器便可。
核心命令:
rsync -av --files-from=list.txt  /  root@host:/命令行

rsync.expect 内容code

#!/usr/bin/expect
set passwd "123456"
set host [lindex $argv 0]
set file [lindex $argv 1]
spawn rsync -av --files-from=$file / root@$host:/  //list.txt里有文件的绝对路径列表
expect {
"yes/no" { send "yes\r"}
"password:" { send "$passwd\r" }
}
expect eof

 ip.list内容
192.168.133.132
192.168.133.133
......

rsync.sh 内容
#!/bin/bash
for ip in `cat ip.list`
do
    echo $ip
    ./rsync.expect $ip list.txt
done

7.命令批量执行
exe.expect 内容ip

#!/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"

exe.sh 内容
#!/bin/bash
for ip in `cat ip.list`
do
    echo $ip
    ./exe.expect $ip "w;free -m;ls /tmp"
done
相关文章
相关标签/搜索