自动化登录工具 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脚本就可以。

 

posted @ 2016-06-06 17:20  某电商首席日志工程师  阅读(283)  评论(0)    收藏  举报