linux下expect使⽤教程
⼀、expect介绍
  Expect是Unix系统中⽤来进⾏⾃动化控制和测试的软件⼯具,由DonLibes制作,作为Tcl脚本语⾔的⼀个扩展,应⽤在交互式软件中如telnet,ftp,Passwd,fsck,rlogin,tip,ssh等等。该⼯具利⽤Unix伪终端包装其⼦进程,允许任意程序通过终端接⼊进⾏⾃动化控制;也可利⽤Tk⼯具,将交互程序包装在X11的图形⽤户界⾯中。
  简单地说,expect是⼀个⼯具,可以根据⽤户设定的规则和系统进程进⾏⾃动化交互,例如远程登陆的密码输⼊、⾃动化的执⾏远程命令。
⼆、expect例⼦
  下⾯的脚本完成远程服务器的登录操作,并在远程服务器上执⾏⼀些简单的命令,在整个交互中不需要⼈⼯进⾏⼲预。
#!/usr/bin/expect if {$argc < 2} {
  puts stdout "$argv0 err params\n"
  exit 1
}
proc do_console_login {login pass} {
puts $login;
puts $pass;
}
puts [llength $argv]
set timeout 10
set user [lindex $argv 0]
set password [lindex $argv 1]
do_console_login $user $password
spawn ls -l
expect "p"
expect eoflinux循环执行命令脚本
spawn ssh $user@10.12.18.37#36000
expect {
    "yes/no" {send "yes\n"
    expect "assword: " {send "$password\n"}
    }
    "*assword:" {send "$password\n"}
}
expect "~>"
send "cd /share/arlenhou/; la \n"
expect "arlenhou>"
interact
三、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 $user@10.12.18.37#36000
spawn启动⼀个进程,进程执⾏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 $user@10.12.18.37#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⼯具可以代替⼈⼯来完成⼀些交互性⼯作。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。