Tcl 我是否错过了exp_continue的目标?

Tcl 我是否错过了exp_continue的目标?,tcl,expect,cisco-ios,Tcl,Expect,Cisco Ios,我正在尝试编写一个expect脚本,它允许我通过ssh连接到交换机,在flash中查找特定的软件集,然后删除它。我想说的是,如果你看到结果“A”,就执行行动“B”,如果你看到结果“C”,就执行行动“B”。当我运行一个命令时,将显示所有这些结果 这是我期待的结果的一个例子 B3898_RM23_SW1#dir ? /all List all files /recursive List files recursively all-filesystems

我正在尝试编写一个expect脚本,它允许我通过ssh连接到交换机,在flash中查找特定的软件集,然后删除它。我想说的是,如果你看到结果“A”,就执行行动“B”,如果你看到结果“C”,就执行行动“B”。当我运行一个命令时,将显示所有这些结果

这是我期待的结果的一个例子

B3898_RM23_SW1#dir ?
  /all             List all files
  /recursive       List files recursively
  all-filesystems  List files on all filesystems
  bs:              Directory or file name
  cns:             Directory or file name
  flash1:          Directory or file name
  flash2:          Directory or file name
  flash:           Directory or file name
  null:            Directory or file name
  nvram:           Directory or file name
  system:          Directory or file name
  tar:             Directory or file name
  tmpsys:          Directory or file name
  vb:              Directory or file name
  xmodem:          Directory or file name
  ymodem:          Directory or file name
  <cr>

  B3898_RM23_SW1#
这是我将脚本导入文件时脚本的输出。。。我只捕获第一个循环

send: sending "dir ?\r" to { exp7 }
Gate keeper glob pattern for '\m(flash[1-9])\M' is 'flash?'. Activating booster.

expect: does "\r\n    6  -rwx       28612  Apr 23 2012 02:35:18 +02:00  config.text.backup\r\n    5  -rwx        1276   Mar 1 1993 01:04:41 +01:00  vlan.dat\r\n    4  -rwx        2404  Jun 17 2013 14:01:30 +02:00  private-config.text\r\n   88  -rwx        2404  Apr 23 2012 02:35:18 +02:00  private-config.text.backup\r\n    8  -rwx       43535  Jun 17 2013 14:01:29 +02:00  config.text\r\n\r\n32514048 bytes total (19417088 bytes free)\r\nB3762_6D205C_SW1&2#" (spawn_id exp7) match regular expression "\m(flash[1-9])\M"? Gate "flash?"? gate=no
"*#"? yes
expect: set expect_out(0,string) "\r\n    6  -rwx       28612  Apr 23 2012 02:35:18 +02:00  config.text.backup\r\n    5  -rwx        1276   Mar 1 1993 01:04:41 +01:00  vlan.dat\r\n    4  -rwx        2404  Jun 17 2013 14:01:30 +02:00  private-config.text\r\n   88  -rwx        2404  Apr 23 2012 02:35:18 +02:00  private-config.text.backup\r\n    8  -rwx       43535  Jun 17 2013 14:01:29 +02:00  config.text\r\n\r\n32514048 bytes total (19417088 bytes free)\r\nB3762_6D205C_SW1&2#"
expect: set expect_out(spawn_id) "exp7"
expect: set expect_out(buffer) "\r\n    6  -rwx       28612  Apr 23 2012 02:35:18 +02:00  config.text.backup\r\n    5  -rwx        1276   Mar 1 1993 01:04:41 +01:00  vlan.dat\r\n    4  -rwx        2404  Jun 17 2013 14:01:30 +02:00  private-config.text\r\n   88  -rwx        2404  Apr 23 2012 02:35:18 +02:00  private-config.text.backup\r\n    8  -rwx       43535  Jun 17 2013 14:01:29 +02:00  config.text\r\n\r\n32514048 bytes total (19417088 bytes free)\r\nB3762_6D205C_SW1&2#"
send: sending "copy tftp: flash:\r" to { exp7 }

expect: does "" (spawn_id exp7) match glob pattern "Address or name of remote host ?"? no
d
expect: does "d" (spawn_id exp7) match glob pattern "Address or name of remote host ?"? no
i
expect: does "di" (spawn_id exp7) match glob pattern "Address or name of remote host ?"? no
r
expect: does "dir" (spawn_id exp7) match glob pattern "Address or name of remote host ?"? no

expect: does "dir " (spawn_id exp7) match glob pattern "Address or name of remote host ?"? no
?
expect: does "dir ?" (spawn_id exp7) match glob pattern "Address or name of remote host ?"? no

  /all             List all files
  /recursive       List files recursively
  all-filesystems  List files on all filesystems
  bs:              Directory or file name
  cns:             Directory or file name
  flash1:          Directory or file name
  flash2:          Directory or file name
  flash:           Directory or file name
  null:            Directory or file name
  nvram:           Directory or file name
  system:          Directory or file name
  tar:             Directory or file name
  tmpsys:          Directory or file name
  vb:              Directory or file name
  xmodem:          Directory or file name
  ymodem:          Directory or file name
  <cr>

B3762_6D205C_SW1&2#dir 
expect: does "dir ?\r\n  /all             List all files\r\n  /recursive       List files recursively\r\n  all-filesystems  List files on all filesystems\r\n  bs:              Directory or file name\r\n  cns:             Directory or file name\r\n  flash1:          Directory or file name\r\n  flash2:          Directory or file name\r\n  flash:           Directory or file name\r\n  null:            Directory or file name\r\n  nvram:           Directory or file name\r\n  system:          Directory or file name\r\n  tar:             Directory or file name\r\n  tmpsys:          Directory or file name\r\n  vb:              Directory or file name\r\n  xmodem:          Directory or file name\r\n  ymodem:          Directory or file name\r\n  <cr>\r\n\r\nB3762_6D205C_SW1&2#dir " (spawn_id exp7) match glob pattern "Address or name of remote host ?"? no


expect: does "dir ?\r\n  /all             List all files\r\n  /recursive       List files recursively\r\n  all-filesystems  List files on all filesystems\r\n  bs:              Directory or file name\r\n  cns:             Directory or file name\r\n  flash1:          Directory or file name\r\n  flash2:          Directory or file name\r\n  flash:           Directory or file name\r\n  null:            Directory or file name\r\n  nvram:           Directory or file name\r\n  system:          Directory or file name\r\n  tar:             Directory or file name\r\n  tmpsys:          Directory or file name\r\n  vb:              Directory or file name\r\n  xmodem:          Directory or file name\r\n  ymodem:          Directory or file name\r\n  <cr>\r\n\r\nB3762_6D205C_SW1&2#dir \r\n" (spawn_id exp7) match glob pattern "Address or name of remote host ?"? no
Directory of flash:/

    2  -rwx        9240  Jun 17 2013 14:01:30 +02:00  multiple-fs
    3  -rwx    13006601  Apr 24 2012 19:24:08 +02:00  c3750-ipservicesk9-mz.122-55.SE5.bin
    6  -rwx       28612  Apr 23 2012 02:35:18 +02:00  config.text.backup
    5  -rwx        1276   Mar 1 1993 01:04:41 +01:00  vlan.dat
    4  -rwx        2404  Jun 17 2013 14:01:30 +02:00  private-config.text
   88  -rwx        2404  Apr 23 2012 02:35:18 +02:00  private-config.text.backup
    8  -rwx       43535  Jun 17 2013 14:01:29 +02:00  config.text

32514048 bytes total (19417088 bytes free)
B3762_6D205C_SW1&2#
expect: does "dir ?\r\n  /all             List all files\r\n  /recursive       List files recursively\r\n  all-filesystems  List files on all filesystems\r\n  bs:              Directory or file name\r\n  cns:             Directory or file name\r\n  flash1:          Directory or file name\r\n  flash2:          Directory or file name\r\n  flash:           Directory or file name\r\n  null:            Directory or file name\r\n  nvram:           Directory or file name\r\n  system:          Directory or file name\r\n  tar:             Directory or file name\r\n  tmpsys:          Directory or file name\r\n  vb:              Directory or file name\r\n  xmodem:          Directory or file name\r\n  ymodem:          Directory or file name\r\n  <cr>\r\n\r\nB3762_6D205C_SW1&2#dir \r\nDirectory of flash:/\r\n\r\n    2  -rwx        9240  Jun 17 2013 14:01:30 +02:00  multiple-fs\r\n    3  -rwx    13006601  Apr 24 2012 19:24:08 +02:00  c3750-ipservicesk9-mz.122-55.SE5.bin\r\n    6  -rwx       28612  Apr 23 2012 02:35:18 +02:00  config.text.backup\r\n    5  -rwx        1276   Mar 1 1993 01:04:41 +01:00  vlan.dat\r\n    4  -rwx        2404  Jun 17 2013 14:01:30 +02:00  private-config.text\r\n   88  -rwx        2404  Apr 23 2012 02:35:18 +02:00  private-config.text.backup\r\n    8  -rwx       43535  Jun 17 2013 14:01:29 +02:00  config.text\r\n\r\n32514048 bytes total (19417088 bytes free)\r\nB3762_6D205C_SW1&2#" (spawn_id exp7) match glob pattern "Address or name of remote host ?"? no
c
我想说:

set flash_dirs {}
send "dir ?\r"
expect {
    -re {\m(flash[1-9])\M} {
        lappend flash_dirs $expect_out(1,string)
        exp_continue
    }
    "*#"
}
foreach dir $flash_dirs {
    send "delete /force /recursive $dir:c3750-ipservicesk9-mz.122-55.SE5\r"
    expect "*#"
    send "delete /force /recursive $dir:c3750-ipservicesk9-mz.122-55.SE5.bin\r"
    expect "*#"
}
然后将内容复制到flash1中。在此之后,我假设目录列表没有更改,因此您已经知道安装了哪些闪存驱动器:

foreach dir $flash_dirs {
    if {$dir eq "flash1"} continue
    send "copy flash1:c3750-ipservicesk9-mz.122-55.SE7.bin $dir:\r"
    expect "Destination filename"
    send "\r"
    expect "*#"
}

要多得多。当然没有经过测试。

所以出于某种原因,它在做dir flash:(顺便说一下,flash和flash1是同一个目录,对其进行编号的唯一原因是为了识别您在堆栈中使用的交换机)。它不是删除旧的.bin文件,也不是将新的.bin文件复制到堆栈的其他成员。将
exp_internal 1
添加到脚本顶部。Expect将向您显示发生了什么。它只是不断重复“dir?”而没有实际查找任何编号的闪存目录,如flash2、flash3等。。。我已经设法将exp_internal的输出通过管道传输到一个文件中。有没有办法将其发布到这里,或者我应该编辑我的原始帖子并将其发布到那里?通读一遍,似乎没有任何内容与正则表达式匹配。在expect debug输出中,第一个“dir?”会将结果发送到实际的文件列表中。你想在那里看到flash关键字吗?
set DIR {flash2 flash3 flash4 flash5 flash6 flash7 flash8 flash9}
send "dir ?\r"
expect {
    -re {\m(flash[2-9])\M} {
        lappend DIR $expect_out(1,string)
        exp_continue
    }
    "*#"
}
foreach X $DIR {
    send "copy flash1:c3750-ipservicesk9-mz.122-55.SE7.bin $X:\r"
    expect "Destination filename"
    send "\r"
    expect "*#"
}
set flash_dirs {}
send "dir ?\r"
expect {
    -re {\m(flash[1-9])\M} {
        lappend flash_dirs $expect_out(1,string)
        exp_continue
    }
    "*#"
}
foreach dir $flash_dirs {
    send "delete /force /recursive $dir:c3750-ipservicesk9-mz.122-55.SE5\r"
    expect "*#"
    send "delete /force /recursive $dir:c3750-ipservicesk9-mz.122-55.SE5.bin\r"
    expect "*#"
}
foreach dir $flash_dirs {
    if {$dir eq "flash1"} continue
    send "copy flash1:c3750-ipservicesk9-mz.122-55.SE7.bin $dir:\r"
    expect "Destination filename"
    send "\r"
    expect "*#"
}