使用Expect脚本将IP地址提取到变量

时间:2012-10-29 19:20:02

标签: expect ifconfig

您好我是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

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

有人可以帮我从ifconfig命令中提取IP地址并将其存储在变量中吗?我一直在使用$ expect_out(缓冲区),但是我无法理解它。我们非常感谢您对这些方面的任何帮助。

4 个答案:

答案 0 :(得分:4)

您不需要生成shell:

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

spawn ping -c 10 $ipaddr
expect eof

实际上,你不需要使用Expect:在普通的Tcl中(对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"
    }
}

答案 1 :(得分:1)

您可以在现有代码上使用regexp

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只是符合regexp语法,要求在捕获组之前存在变量 - 在这个特定的例子中它是一次性数据 - regexp的重写版本可以使用match来存储此示例的ip,但一般来说我发现捕获组更灵活,因为你可以有几个从单个字符串中捕获不同的数据。

您可能希望阅读regexp命令和regular expressions,因为Expect广泛使用它们。

答案 2 :(得分:0)

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

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

答案 3 :(得分: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