Expect的基本使用介绍

Expect是Unix系统中用来进行自动化控制和测试的软件工具,由DonLibes制作,作为Tcl脚本语言的一个扩展,应用在交互式软件中如telnet,ftp,Passwd,fsck,rlogin,tip,ssh等等。该工具利用Unix伪终端包装其子进程,允许任意程序通过终端接入进行自动化控制;也可利用Tk工具,将交互程序包装在X11的图形用户界面中。
  简单地说,expect是一个工具,可以根据用户设定的规则和系统进程进行自动化交互,例如远程登陆的密码输入、自动化的执行远程命令。

yum install expect
测试
 #!/usr/bin/expect
 spawn ssh 172.25.12.228
expect {
 #"yes/no" { send "yes\r";exp_continue}
 "password" { send "a\r"}
 }
expect "root@"

send "ip a s ens33\rexit\r"
#这个命令的意思是断开链接
#expect eof
#ssh 以后连接那个虚拟机,可以继续操作
interact
可以自动的登录不用交互式的输入密码
1 #!/usr/bin/expect
2
3 spawn ssh [email protected]
4 expect "password"
5 send "123456\r"
6 interact
~

尝试连接查询ip enss33
for i in {2..9};do ./expect2.exp 127.25.11.1$i;done

chmod a+x expect2.exp
[root@localhost 123]# cat expect2.exp
#!/usr/bin/expect
#
if { $argc == 0 } {
puts "Usage:\n\t$argv0 yourIP...\n"
exit
}

set myname "root"
set myip [lindex $argv 0]
puts "\tusername:$myname\n \thost:$myip"
set timeout 3
spawn ssh $myname@$myip /sbin/ifconfig ens33
expect {
"yes/no" {send "yes\n"; exp_continue}
"password" {send "123456\n"}
timeout { send_user "Time's up !\n";exit}
}
expect eof

exit -onexit {
send_user "Good bye!\n"
}
 

三、expect语法介绍


 

1. 命令行参数


$argc,$argv 0,$argv 1 ... $argv n argc表示命令行参数个数,后面分别表示各个参数项,0表示第一个参数,
1表示第二个参数,以此类推,可以通过lindex获取对应参数值(lindex $argv 0)。
if {$argc < 2} {
puts stdout "$argv0 err params\n"
exit 1
}

2. 输入输出


puts stderr "Usage: $argv0 login passwaord.n "

puts “hello world”

puts stdout "1234"

3. 嵌套命令


set user [lindex $argv 0]
set password [lindex $argv 1]把命令行第一个参数赋给user,第二个参数赋给password。
 

4. 命令调用


spawn ssh [email protected]#36000spawn启动一个进程,进程执行ssh命令,程序后面可以通过expect/send和新起的进程进行交互。
 

5. 函数定义和调用


proc do_console_login {login pass} {

}

do_console_login $user $password

6. 变量赋值


set user “arlen ”

set int0 1

7. 循环


while ($done) {

}

8. 条件分支Switch


switch -- $var {

0 {

}

1 {

}

2 {

}

}

三、常用指令


 

1. [#!/usr/bin/expect] 


  这一行告诉操作系统脚本里的代码使用那一个shell来执行。这里的expect其实和linux下的bash、windows下的cmd是一类东西。 
  注意:这一行需要在脚本的第一行。
 

2. [set timeout 30]


  设置超时时间的,单位是:秒 
 
 

3. [spawn ssh [email protected]#36000]


  spawn是进入expect环境后才可以执行的expect内部命令,如果没有装expect或者直接在默认的SHELL下执行是找不到spawn命令的。它主要的功能是给ssh运行进程加个壳,用来传递交互指令。 
 

4. [expect "assword: "]


  这里的expect也是expect的一个内部命令,expect的shell命令和内部命令是一样的,但不是一个功能。这个命令的意思是判断上次输出结果里是否包含“password:”的字符串,如果有则立即返回,否则就等待一段时间后返回,这里等待时长就是前面设置的30秒。
 

5. [send "$password\n"] 


  这里就是执行交互动作,与手工输入密码的动作等效。
 

6. [interact] 


  执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。
 

四、总结


  expect工具在日常的运维中非常有用,可以用在多机器服务重启、远程copy、多机器日志查看、ftp文件操作、telnet等多种场景。
shell中有些操作会受限于密码输入的人工操作,expect工具可以代替人工来完成一些交互性工作。

猜你喜欢

转载自blog.csdn.net/qq_37194598/article/details/84849284