【问题标题】:Telnet SMTP with expect or shell scriptTelnet SMTP 与期望或 shell 脚本
【发布时间】:2012-09-07 14:58:24
【问题描述】:

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

#!/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)

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

【问题讨论】:

  • 我建议使用smtp。您可以从期望中集成/使用它,您只需要添加行package require smtp。如果您没有安装此软件包,请安装 tcllib - 通常通过使用首选数据包管理器安装 tcllib 来完成)
  • 如果你坚持这种方法,你应该修复它,以便只匹配一系列连续回复中的最后一个。您应该忽略任何“220-”并且只匹配“220”(2、2、0、空格)。顺便说一句,正则表达式末尾的{1,} 通常没有任何好处,但在这里,它实际上是错误的,尽管无害(不应匹配 2200 等)。

标签: regex linux shell expect ubuntu-12.04


【解决方案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

【讨论】:

    【解决方案2】:

    发送“ehlo”后需要换行:

    send "ehlo\n"
    

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

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

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

    【讨论】:

    • 谢谢...现在它可以工作了,但在 220 smtp109.mail.ukl.yahoo.com ESMTP 处停止...并等到 webmaiserver 退出...根本不发送 ehlo。 ..
    • 您需要告诉 expect 您使用的是正则表达式模式而不是全局模式:expect -re {[2]{2,}[0]{1,}}
    • 要查看期望匹配/不匹配的内容,请在脚本开头使用命令exp_internal 1。根据我的经验,autoexpect 脚本可以方便地为您提供一个起点,但需要进行大量编辑才能处理更一般的情况。
    猜你喜欢
    • 2013-01-19
    • 2014-11-13
    • 2023-03-21
    • 2011-12-09
    • 2011-07-07
    • 2015-07-30
    • 2013-01-01
    • 1970-01-01
    • 2019-08-22
    相关资源
    最近更新 更多