预期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

嗨,我正在尝试制作以下脚本

  • 我们通过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
    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"