Expect作为一种重要的TCL扩展包,主要有以下几个命令:
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脚本执行即可。
原文地址:http://bretoncrepe.blog.51cto.com/9590251/1576643