Expect作为一种重要的TCL扩展包,主要有以下几个命令:

  1. spawn用于启动一个进程,之后所有expect操作都在这个进程中进行。

如果没有装expect或者直接在默认的SHELL下执行是找不到spawn命 令的。所以不要用 “which spawn“之类的命令去找spawn命令。

   spawn ssh root@135.251.193.217
   spawn telnet 135.251.193.217

 2. expect & exp_send

 expect "password:"
 exp_send "word\r"

  也可以在一个expec中匹配多个关键字

expect -re "password:" {  exp_send "word\r" }
       -re "noresponse" {}

读到noresponse,会退出expect

3. 关于exp_send 和 send

  exp_send可发送一些特殊符号 \r, \n, \t

4. 关于exp_continue

expect -re "password:" {  exp_send "word\r";exp_continue}
       -re "noresponse" {}

exp_continue会使匹配第一个关键字后从头开始再匹配第二个关键字

5. exp_pid 用来获取当前spawn的id

6. set timeout 30

用以设置expec等待超时时间

7. close -id

杀死对应的spawn_id的进程。

8 interact

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


举例:脚本自动上传log

#!/usr/bin/expect
spawn scp [lindex $argv 0] root@135.251.193.219:/home
expect "root@135.251.193.219's password:" {exp_send "123456\n"}
interact

把上面保存为expect_script

#!/bin/bash
for f in `ls /log/*.log`
do
    expect_script $f
done

再编写如上的bash脚本执行即可。