预期regexp示例cisco
嗨,我正在尝试制作以下脚本预期regexp示例cisco,regex,expect,cisco,Regex,Expect,Cisco,嗨,我正在尝试制作以下脚本 我们通过ssh访问设备-它可以工作 我们执行该命令,并从该命令中获得必要的数据 通过regexp 我们将接收到的数据写入一个变量 使用变量执行命令 但是它不起作用 expect -d ssh 192.168.18.200 expect -d ssh 192.168.18.200 expect version 5.45.4 argv[0] = expect argv[1] = -d argv[2] = ssh argv[3] = 192.168.18.200 se
expect -d ssh 192.168.18.200
expect -d ssh 192.168.18.200
expect version 5.45.4
argv[0] = expect argv[1] = -d argv[2] = ssh argv[3] = 192.168.18.200
set argc 1
set argv0 "ssh"
set argv "192.168.18.200"
executing commands from command file ssh
spawn ssh -o StrictHostKeyChecking=no test@192.168.18.200
parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized from child
spawn: returns {22907}
expect: does "" (spawn_id exp5) match glob pattern "*assword:"? no
Password:
expect: does "\rPassword: " (spawn_id exp5) match glob pattern "*assword:"? yes
expect: set expect_out(0,string) "\rPassword:"
expect: set expect_out(spawn_id) "exp5"
expect: set expect_out(buffer) "\rPassword:"
send: sending "123456\r" to { exp5 }
expect: does " " (spawn_id exp5) match glob pattern "*#"? no
expect: does " \r\n" (spawn_id exp5) match glob pattern "*#"? no
test-gw#
expect: does " \r\ntest-gw#" (spawn_id exp5) match glob pattern "*#"? yes
expect: set expect_out(0,string) " \r\ntest-gw#"
expect: set expect_out(spawn_id) "exp5"
expect: set expect_out(buffer) " \r\ntest-gw#"
send: sending "sh ip int br | i Vlan9\n" to { exp5 }
can't read "ip": no such variable
while executing
"puts "ADDRESS: $ip""
(file "ssh" line 17)
在路由器上,它看起来像这样
sh ip int br | i Vlan9
Vlan9 192.168.18.200 YES NVRAM up up
通过send我们执行这个命令,通过regexp我们需要提取地址192.168.18.200并将其写入一个变量以供进一步使用我看到expect是基于TCL的,所以:
首先-您的regexp有一个错误:大括号内的引号将使regexp在输入本身中查找引号。
其次,如果您想对捕获的字符串执行某些操作,则需要分配它。 如果没有,为什么要在regexp中放置大括号?
有关正则表达式赋值,请参见下面的示例
> set line "the ip is 192.35.32.0 bla bla bka"
the ip is 192.35.32.0 bla bla bka
> regexp {(\d+\.\d+\.\d+\.\d+)} $line -> ip
1
> echo $ip
192.35.32.0
因此,当转换为expect
时,expect_out(1,字符串)与$ip相同
编辑expect-re{(\d+\.\d+\.\d+\.\d+}…
结果将显示在expect out(1,string)var上这就是它的工作方式
expect -exact "#"
send -- "sh ip int br | i Vlan9 \r"
expect -exact "#"
set src $expect_out(buffer)
regexp {(\d+.\d+.\d+.\d+)} $src match ipsrc
expect -exact "#"
send -- "ping $ipsrc\r"
问题出现了,如果我们可以在一个脚本、ping/tracert、端口状态中进行这样的检查,如何用括号将它们分开,以及如何更正确地使用超时
expect -exact "#"
send -- "sh int des | i main | Main\r"
expect -exact "#"
set description $expect_out(buffer)
regexp {(Gi0\/1\/0)|(Fa0\/0\/0)|(Fa0)|(Gi0)} $description match interface
expect -exact "#"
send -- "sh int $interface\r"
#expect -exact "#"
#send -- "sh ip int br | i Vlan9 \r"
#expect -exact "#"
#set src $expect_out(buffer)
#regexp {(\d+.\d+.\d+.\d+)} $src match ipsrc
#expect -exact "#"
#send -- "ping $ipsrc\r"
您能给出合法和非法行的输入示例吗?此expect看起来像TCL,因此您的regexp中缺少捕获分配使用
expect-d myprog.exp arg…
-非常详细的调试输出将向您显示模式不匹配的原因。不,您读错了我的答案。把我的regexp放在你期望的地方。IP将出现在expect_out(1,string)变量中。是的,我不明白:它工作-expect-精确“#”发送--“sh run | i hostname\r”set name$expect_out(buffer)regexp{([[u A-Za-z0-9]+)}$name匹配主机名放置“$hostname”它不工作-expect-精确“#”发送--“sh IP int br | i Vlan9\r”set src$expect_out(buffer)regexp{(\d+\.\d+\.\d+\.\d+}$src match ipsrc puts“ADDRESS:$ipsrc”您可以做的最好的事情是编辑您的问题,使其包含几行您希望被接受的行和几行不希望被接受的行。目前,要使代码正常工作,您只需删除引号(“)从regexphmm开始,但是如何使代码在注释中可读???在我检查过的TCL中,它可以工作,但在except中则不行
expect -exact "#"
send -- "sh int des | i main | Main\r"
expect -exact "#"
set description $expect_out(buffer)
regexp {(Gi0\/1\/0)|(Fa0\/0\/0)|(Fa0)|(Gi0)} $description match interface
expect -exact "#"
send -- "sh int $interface\r"
#expect -exact "#"
#send -- "sh ip int br | i Vlan9 \r"
#expect -exact "#"
#set src $expect_out(buffer)
#regexp {(\d+.\d+.\d+.\d+)} $src match ipsrc
#expect -exact "#"
#send -- "ping $ipsrc\r"