3

嗨,我是 Expect 脚本的新手,我一直在尝试使用以下方法将 IP 地址获取到变量中:

set timeout -1
spawn $env(SHELL)
match_max 100000
send "ifconfig | grep -A 1 'eth1' | tail -1\r "
expect -re "inet addr:.* " {send "ping $expect_out(0,string)\r"}
send -- "exit\r"
expect eof

问题是它正在尝试使用 ifconfig 命令的结果进行 ping,其中包含一些字符串字符。

谁能帮我从 ifconfig 命令中提取 IP 地址并将其存储在变量中?我也一直在使用 $expect_out(buffer) ,但就是无法理解它。任何有关这些方面的帮助将不胜感激。

4

4 回答 4

4

您不需要生成外壳:

spawn ifconfig eth1
expect -re {inet addr:(\S+)}
set ipaddr $expect_out(1,string)
expect eof

spawn ping -c 10 $ipaddr
expect eof

事实上,你不需要在纯 Tcl 中使用 Expect: (对 ping 进行额外的错误检查):

if {[regexp {inet addr:(\S+)} [exec ifconfig eth1] -> ipaddr]} {
    set status [catch [list exec ping -c 10 $ipaddr] output]
    if {$status == 0} {
        puts "no errors from ping: $output"
    } else {
        puts "ERROR: $output"
    }
}
于 2012-10-30T14:25:27.267 回答
1

您可以在现有代码上使用正则表达式:

expect -re "inet addr:.* " {
  regexp {inet.*?(\d+\.\d+\.\d+\.\d+)} $expect_out(buffer) match ip
  puts "Pinging $ip"
  send "ping $ip\r"
}

在行中:

regexp {inet.*?(\d+\.\d+\.\d+\.\d+)} $expect_out(buffer) match ip

regexp 命令在括号中的“捕获组”中捕获 IP 地址:

(\d+\.\d+\.\d+\.\d+)

然后将其存储在变量中ip

expect_out(buffer)变量是源字符串,包含到目前为止通过期望读取的所有内容(取决于您的expect -re命令),并且match是另一个变量,它存储与整个正则表达式匹配的字符串(从“inet”到 IP 地址末尾的所有内容。) match很简单那里符合要求在捕获组之前存在变量的正则表达式语法 - 在这个特定示例中它是一次性数据 - 正则表达式的重新设计版本可以使用 match 来存储此示例的 ip,但通常我找到捕获组更灵活,因为您可以有多个从单个字符串中捕获不同的数据。

您可能需要阅读regexp命令和一般的正则表达式,因为 Expect 非常广泛地使用它们。

于 2012-10-29T19:51:25.493 回答
0

将您的 'send 更改"ifconfig | grep -A 1 'en1' | tail -1\r"为如下所示。

send "ifconfig | grep -A 1 'en1' | tail -1 | cut -d' ' -f2\r"

于 2012-10-29T19:25:56.947 回答
0
$ifconfig 
eth0      Link encap:Ethernet  HWaddr 00:1b:fc:72:84:12  
      inet addr:172.16.1.13  Bcast:172.16.1.255  Mask:255.255.255.0
      inet6 addr: fe80::21b:fcff:fe72:8412/64 Scope:Link
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:638661 errors:0 dropped:20 overruns:0 frame:0
      TX packets:93858 errors:0 dropped:0 overruns:0 carrier:2
      collisions:0 txqueuelen:1000 
      RX bytes:101655955 (101.6 MB)  TX bytes:42802760 (42.8 MB)
      Memory:dffc0000-e0000000 

lo        Link encap:Local Loopback  
      inet addr:127.0.0.1  Mask:255.0.0.0
      inet6 addr: ::1/128 Scope:Host
      UP LOOPBACK RUNNING  MTU:16436  Metric:1
      RX packets:3796 errors:0 dropped:0 overruns:0 frame:0
      TX packets:3796 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:0 
      RX bytes:517624 (517.6 KB)  TX bytes:517624 (517.6 KB)

尝试这个:

ifconfig | sed '2,2!d' | sed 's/.*addr://' | sed 's/\ .*//' > ipaddress

这将给 ip

$vi ipaddress 
于 2013-06-14T12:25:53.797 回答