自动化登录工具 expect
一,expect的功能: expect可以让我们实现自动登录远程机器,并且可以实现自动远程执行命令。
二,自动远程登录
2.1,创建远程登录脚本 vim /usr/local/sbin/login.expect
#! /usr/bin/expect #注明使用哪种解析工具
set host "192.168.11.102" #用set 设置变量
set passwd "123456"
spawn ssh root@$host #spawn是进入expect环境后才可以执行的expect内部命令,如果没有装expect或者直接在默认的SHELL下执行是找不到spawn命令的。
expect{
"yes/no" { send "yes\r"; exp_continue } #对ssh登录时,提示信息,进行回复 \r表示回车 其中{}括号内要有空格 。
"assword:" { send "$passwd\r" } #对于提示信息,可以写部分字符串。
}
interact # 表示执行完成后保持交互状态,如果不加此参数,即登陆后马上退出,如果脚本涉及到ssh的话,就加上这个选项。
2.2 执行该脚本
chmod a+x /usr/local/sbin/login.expect
./usr/local/sbin/login.expect或者expect /usr/local/sbin/login.expect
注意:
执行脚本不能使用bash sh等命令去执行,因为该脚本并不是用shell所写。
当你执行这个脚本的时候,总是会到你输入密码的时候不动了。那是因为在等待password这个关键字的时候,超过了默认设置的10秒,于是我们的脚本就提前把password送入输入流了,结果导致expect脚本执行失败,换言之,密码输入太早了。
解决方法:在此脚本中添加set timeout -1 设置超时时间为永不超时即可。
三,自动登录远程后执行命令
3.1 vim /usr/local/sbin/login.expect
#!/usr/bin/expect
set user "root"
set passwd "123456"
spawn ssh $user@192.168.11.18
expect {
"yes/no" { send "yes\r"; exp_continue}
"password:" { send "$passwd\r" }
}
expect "]*"
send "touch /tmp/12.txt\r"
expect "]*"
send "echo 1212 > /tmp/12.txt\r"
expect "]*"
send "exit\r"
interact
3.2 上述脚本添加部分需要执行的命令,登录远程机器,当看到"[*"的字符串时执行创建12.txt文档回车,回车后看到"[*"字符串的时执行echo命令,最后在看到"[*"该字符串时exit。
四,expect脚本传递参数
4.1 vim /usr/local/sbin/login.expect
#!/usr/bin/expect
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"}
"password:" { send "$passwd\r" }
}
expect "]*"
send "$cm\r"
expect "]*"
send "exit\r"
interact
4.2 用[lindex $argv ] 创建变量参数,上述脚本创建了3个变量,参数从0开始,执行时将变量内容添加上去。
./usr/local/sbin/login.expect root 192.168.11.11 ls
五,自动同步文件脚本
5.1 vim /usr/local/sbin/login.expect
#!/usr/bin/expect
set passwd "123456"
spawn rsync -av root@192.168.11.18:/tmp/12.txt /tmp/
expect {
"yes/no" { send "yes\r"}
"password:" { send "$passwd\r" }
}
expect eof
5.2 上述脚本用的rsync 这是远程拷贝文件的软件,具体rsync的使用方法后续更新。
yum install -y rsync
可能还是没法所以使用,再安装这个包 yum install -y openssh-clients
rsync -av root@192.168.11.18:/tmp/12.txt /tmp/ 指的是将将远程主机11.18的tmp目录下的文件12.txt拉取到本地/tmp下去。
结束符用的是expect eof 其中这里的expect eof 会退出远程的机器, interact 不会退出远程机器。换言之,上面的使用interact也是没问题的,但是建议用法是当脚本中涉及到ssh到远程主机时,结束符统一用interact,当脚本中涉及rsync等其他命令,结束符统一用expect eof。
六,指定Ip和指定文件同步脚本。
6.1 vim /usr/local/sbin/login.expect
#!/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.2 其实这里只是比上面脚本多1个参数而已,就不过多讲解了,不懂可以加本人QQ384108391共同探讨。
七,构建文件分发系统
实现思路:首先要有一台模板机器,把要分发的文件准备好,然后只要使用expect脚本批量把需要同步的文件分发到目标机器即可。
核心命令:rsync -av --files-from=list.txt / root@host:/
7.1 创建rsync.expect rsync.sh脚本和ip.list file.list 文档。
其中rsync.expect 负责拷贝数据,rsync.sh 负责调用执行rsync.expect和ip的循环。
ip.list 存放ip file.list 存放要同步的文件、目录的路径。
7.2 vim rsync.expect
#!/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"}
"password:" { send "$passwd\r" }
}
expect eof
7.3 vim rsync.sh
#!/bin/bash
for ip in `cat ip.list`
do
echo $ip
./rsync.expect $ip file.list
done
7.4 vim ip.list
192.168.11.18
192.168.11.20
7.5 viim file.list
/usr/local/sbin/1.txt
/usr/local/sbin/2.txt
最后执行rsync.sh即可完成批量同步文件。
八,批量执行命令
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"
vim exe.sh
#!/bin/bash for ip in `cat ip.list` do echo $ip ./exe.expect $ip "w;free -m;ls /tmp" done
这里也是利用IP做了一个循环,在每台机器上在执行命令,执行多个命令用;隔开。基于命令有多个且可能存在特殊符号,那么用在这里就不合适了。那么可以这样,写一个shell脚本分布同步到各个机器上,再编辑exe.sh脚本时,第2个参数可以用sh+shell脚本就可以。

浙公网安备 33010602011771号