1

想用期望脚本建立一个 Auth Smtp 连接......只是为了测试我想获取 ehlo 参数但期望不能像这样工作

#!/usr/bin/expect
set timeout -1
set smtp [lindex $argv 0]
set port [lindex $argv 1]
spawn telnet $smtp $port
expect "[2]{2,}[0]{1,}"
send "ehlo\n"

我希望代码 220 来自邮件服务器以继续发送 ehlo ...就像

..../...:telnet smtp.mail.yahoo.de 25
Trying 77.238.184.85...
Connected to smtp2-de.mail.vip.ukl.yahoo.com.
Escape character is '^]'.
220 smtp116.mail.ukl.yahoo.com ESMTP
ehlo
250-smtp116.mail.ukl.yahoo.com
250-AUTH LOGIN PLAIN XYMCOOKIE
250-PIPELINING
250-SIZE 41697280
250 8BITMIME

错误说:

spawn telnet smtp.mail.yahoo.de 25
invalid command name "2"
    while executing
"2"
    invoked from within
"expect "[2]{2,}[0]{1,}""
    (file "./login.exp" line 6)

如果我只写期望“220”而不是期望“[2]{2,}[0]{1,}”它可以工作但忽略发送“ehlo\n”

4

2 回答 2

1

正如上面所建议的,我使用exp_internal 1来了解期望真正听到的内容......另外,我可以推荐autoexpect,它创建的期望脚本并不完美,但在改进了一些编码之后,它是一个真正的帮助,最后它起作用了。

#!/usr/bin/expect
#exp_internal 1
set timeout -1
set smtp [lindex $argv 0]
set port [lindex $argv 1]
spawn telnet $smtp $port
expect -re {[2]{2,}[0]{1,}}
sleep 3;
send -- "Ehlo\r"
expect -re {[2]{1,}[5]{1,}[0]{1,}}
send -- "quit\r"
expect eof
于 2012-09-08T07:01:53.523 回答
0

发送“ehlo”后需要换行:

send "ehlo\n"

编辑:根据您的最新编辑,您还必须转义正则表达式中的前括号,以防止 tcp 尝试将其解释为命令:

expect "\[2]{2,}\[0]{1,}"

编辑:另外,您的期望线实际上与您认为的不匹配。在这一点上,我建议运行许多关于 expect 的教程,或者简单地使用autoexpect来生成你的脚本。

于 2012-09-07T15:36:34.180 回答