expect学习

1. expect 是基于tcl 演变而来的,所以很多语法和tcl 类似,基本的语法如下

所示:

1.1 首行加上/usr/bin/expect

1.2 spawn: 后面加上需要执行的shell 命令,比如说spawn sudo touch testfile

1.3 expect: 只有spawn 执行的命令结果才会被expect 捕捉到,因为spawn 会启

动一个进程,只有这个进程的相关信息才会被捕捉到,主要包括:标准输入的提

示信息,eof 和timeout。

1.4 send 和send_user:send 会将expect 脚本中需要的信息发送给spawn 启动

的那个进程,而send_user 只是回显用户发出的信息,类似于shell 中的echo 而

已。

 

2. 一个小例子,用于linux 下账户的建立:

filename: account.sh,可以使用./account.sh newaccout 来执行;

1 #!/usr/bin/expect

2

3 set passwd "mypasswd"

4 set timeout 60

5

6 if {$argc != 1} {

7 send "usage ./account.sh \$newaccount\n"

8 exit

9 }

10

11 set user [lindex $argv [expr $argc-1]]

12

13 spawn sudo useradd -s /bin/bash -g mygroup -m $user

14

15 expect {

16 "assword" {

17 send_user "sudo now\n"

18 send "$passwd\n"

19 exp_continue

20 }

21 eof

22 {

23 send_user "eof\n"

24 }

25 }

26

27 spawn sudo passwd $user

28 expect {

29 "assword" {

30 send "$passwd\n"

31 exp_continue

32 }

33 eof

34 {

35 send_user "eof"

36 }

37 }

38

39 spawn sudo smbpasswd -a $user

40 expect {

41 "assword" {

42 send "$passwd\n"

43 exp_continue

44 }

45 eof

46 {

47 send_user "eof"

48 }

49 }

 

3. 注意点:

 

第3 行: 对变量赋值的方法

第4 行: 默认情况下,timeout 是10 秒;

第6 行: 参数的数目可以用$argc 得到;

第11 行:参数存在$argv 当中,比如取第一个参数就是[lindex $argv 0];并且

如果需要计算的话必须用expr,如计算2-1,则必须用[expr 2-1]

第13 行:用spawn 来执行一条shell 命令,shell 命令根据具体情况可自行调整;

有文章说sudo 要加-S,经过实际测试,无需加-S 亦可;

第15 行:一般情况下,如果连续做两个expect,那么实际上是串行执行的,用。expect 与“{ ”之间直接必须有空格或则TAB间隔,否则会出麻烦,会报错invalid command name "expect{" 

例子中的结构则是并行执行的,主要是看匹配到了哪一个;在这个例子中,如果

你写成串行的话,即

expect "assword"

send "$passwd\n"

expect eof

send_user "eof"

那么第一次将会正确运行,因为第一次sudo 时需要密码;但是第二次运行时由于

密码已经输过(默认情况下sudo 密码再次输入时间为5 分钟),则不会提示用户

去输入,所以第一个expect 将无法匹配到assword,而且必须注意的是如果是

spawn 命令出现交互式提问的但是expect 匹配不上的话,那么程序会按照timeout

的设置进行等待;可是如果spawn 直接发出了eof 也就是本例的情况,那么expect

"assword"将不会等待,而直接去执行expect eof。

这时就会报expect: spawn id exp6 not open,因为没有spawn 在执行,后面的

expect 脚本也将会因为这个原因而不再执行;所以对于类似sudo 这种命令分支

不定的情况,最好是使用并行的方式进行处理;

第17 行:仅仅是一个用户提示而已,可以删除;

第18 行:向spawn 进程发送password;

第19 行:使得spawn 进程在匹配到一个后再去匹配接下来的交互提示;

第21 行:eof 是必须去匹配的,在spawn 进程结束后会向expect 发送eof;如果

不去匹配,有时也能运行,比如sleep 多少秒后再去spawn 下一个命令,但是不

要依赖这种行为,很有可能今天还可以,明天就不能用了;

 

4. 其他

下面这个例子比较特殊,在整个过程中就不能expect eof 了:

1 #!/usr/bin/expect

2

3 set timeout 30

4 spawn ssh 10.192.224.224

5 expect "password:"

6 send "mypassword\n"

7 expect "*$"

send "mkdir tmpdir\n" #远程执行命令用send发送,不用spawn

9 expect "*$" #注意这个地方,要与操作系统上环境变量PS1相匹配,尤其是有PS1有空格的情况下,一定在expct "*$ "把空格加上,加不上你就完蛋了。我试过。

这个例子实际上是通过ssh 去登录远程机器,并且在远程机器上创佳一个目录,

我们看到在我们输入密码后并没有去expect eof,这是因为ssh 这个spawn 并没

有结束,而且手动操作时ssh 实际上也不会自己结束除非你exit;所以你只能

expect bash 的提示符,当然也可以是机器名等,这样才可以在远程创建一个目

录。

注意,请不要用spawn mkdir tmpdir,这样会使得上一个spawn 即ssh 结束,那

么你的tmpdir 将在本机建立。

当然实际情况下可能会要你确认ssh key,可以通过并行的expect 进行处理,不

多赘述。

 

5. 觉得bash 很多情况下已经很强大,所以可能用expect 只需要掌握这些就好了,

其他的如果用到可以再去google 了。

链接:http://blog.itpub.net/27042095/viewspace-745589/

 

Expect是一种自动化交互式任务的工具,它可以用来控制和自动化与其他程序的交互。在本篇文章中,我们将介绍如何使用Expect来自动收取邮件。 首先,你需要安装ActiveTCL,它是一个TCL的发行版,包含了许多常用的TCL库和工具。安装完成后,你可以在命令行中输入`tclsh` 来启动TCL解释器。 接下来,你需要安装TCL的Expect扩展。在ActiveTCL中,你可以使用`teacup`命令来安装Expect扩展: ``` teacup install Expect ``` 完成安装后,你可以开始编写Expect脚本来自动收取邮件。 下面是一个简单的Expect脚本,可以用来登录到Gmail,并获取最新的一封邮件: ``` #!/usr/bin/expect # 设置用户名和密码 set username "你的Gmail账号" set password "你的Gmail密码" # 启动telnet会话 spawn telnet pop.gmail.com 995 # 等待登录提示 expect "User" send "$username\r" expect "Password:" send "$password\r" # 等待登录成功提示 expect "OK" # 获取最新的一封邮件 send "RETR 1\r" expect "+OK" # 读取邮件内容 expect "From:" expect "Subject:" expect "Date:" expect "\r\n\r\n" set mail_body $expect_out(buffer) # 输出邮件内容 puts $mail_body # 退出会话 send "QUIT\r" expect "Connection closed by foreign host." ``` 在这个脚本中,我们使用`spawn`命令来启动一个telnet会话,连接到Gmail的POP3服务器。然后,我们使用`expect`命令来等待登录提示,并使用`send`命令来发送用户名和密码。接下来,我们等待登录成功提示,并使用`send`命令来获取最新的一封邮件。最后,我们使用`expect`命令来读取邮件内容,并将其保存在`mail_body`变量中,最后输出邮件内容。 这只是一个简单的例子,你可以根据自己的需要编写更复杂的Expect脚本来自动化收取邮件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值