0

我有一个试图从 whatismyip 站点获取主页的期望脚本。我需要同时捕获 - 站点的 IP 和 HTTP 返回码:

#!/usr/bin/expect -f
set timeout -1
spawn telnet www.whatismyip.com 80
expect "Connected to www.whatismyip.com*"
set output $expect_out(0,string)
regexp {Connected to www\.whatismyip\.com.*?(\d+\.\d+\.\d+\.\d+)} $output match ip
send -- "GET / HTTP/1.0\n"
send -- "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4\n"
send -- "Host: www.whatismyip.com\n"
send -- "\n"
send -- "\n"
set output $expect_out(buffer)
regexp {.*HTTP/1.1 200 OK.*} $output match ret
puts $ip
puts $ret
expect eof
exit 0

有两个问题。首先,我将 IP 截断为最后一个字符,并得到未找到变量 ret 的错误:

spawn telnet www.whatismyip.com 80
Trying 108.162.200.37...
Connected to www.whatismyip.com (108.162.200.37).
Escape character is '^]'.
108.162.200.3
can't read "ret": no such variable
    while executing
"puts $ret"
    (file "./t2" line 15)

我尝试了所有方法和可能性,但无法同时纠正它们。请让我知道如何纠正这个问题。

4

1 回答 1

0

第一个问题:由于您无法控制 $expect_out 中的 * 内容(想象这些字符来得很慢,并注意“已连接到 www.whatismyip.com*”已经与“已连接到 www.whatismyip. com (108.16"。而是使用:

set myexpr {Connected to www\.whatismyip\.com.*?(\d+\.\d+\.\d+\.\d+)[^0-9]}; #Note the terminal condition!
expect {
   -re $myexpr {
         #now $expect_out(0,string) contains the right data to dig...
         regexp $myexpr $expect_out(0,string) match ip
   }
}

第二个问题:注意表达式中regexp {.*HTTP/1.1 200 OK.*} $output match ret不包含括号,因此$ret即使输出包含该字符串也永远不会被填充,但我认为 $output 无论如何都是空的,为什么?

和第一个问题一样。想象一下字符来得很慢,在你这样做set output $expect_out(buffer)的时候还没有收到字符(脚本本身通常比通过网络传输数据要快得多,并且缓冲区在数据发送后立即设置,无需等待响应)。再次,使用期望:

expect {
   "HTTP/1.1 200 OK" { 
        #do some stuff here ...
   }
}
于 2013-02-20T11:02:15.263 回答