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