2013-06-14 4 views
2

나는 스위치로 ssh를 할 수있게 해주는 expect 스크립트를 작성하고, 플래시의 특정 소프트웨어 세트를 찾은 다음 삭제한다. 나는 결과 "A"가 "B"를, 결과 "C"가 "B"를 보았다고 말하고 싶습니다. 하나의 명령을 실행하면 이러한 모든 결과가 표시됩니다.exp_continue가있는 대상이 누락 되었습니까?

이것은 내가 예상 한 결과의 예입니다.

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# 

내가 찾고있는 것은 "flash1 :"디렉토리입니다. 이제 총 9 개의 플래시 파일 시스템이 될 가능성이 있습니다. 항상 "flash1 :"을 갖습니다. 내가하고 싶은 일은 각각의 가능한 디렉토리로 가서 파일이나 전체 디렉토리를 삭제하는 것입니다. 그리고 만약 그들이 다른 디렉토리를 옮기고 싶지 않다면.

내가 알고 싶은 것은 exp_continue를 올바르게 사용하는 방법 또는이 인스턴스에서 전혀 사용해야하는 경우입니다. 이것은 내가 작성한 것이며, 소프트웨어를 flash1에 복사하지만, flas2 등이 존재하면 다른 플래시에 소프트웨어를 복사하거나 삭제하지 않아도됩니다.

send "dir ?\r" 
expect { 
    -re {\mflash1\M} { 
     send "delete /force /recursive flash1:c3750-ipservicesk9-mz.122-55.SE5\r" 
     expect "*#" 
     send "delete /force /recursive flash1:c3750-ipservicesk9-mz.122-55.SE5.bin\r" 
     expect "*#" 
     } 
    -re {\mflash2\M} { 
     send "delete /force /recursive flash2:c3750-ipservicesk9-mz.122-55.SE5\r" 
     expect "*#" 
     send "delete /force /recursive flash2:c3750-ipservicesk9-mz.122-55.SE5.bin\r" 
     expect "*#" 
     } 
    -re {\mflash3\M} { 
     send "delete /force /recursive flash3:c3750-ipservicesk9-mz.122-55.SE5\r" 
     expect "*#" 
     send "delete /force /recursive flash3:c3750-ipservicesk9-mz.122-55.SE5.bin\r" 
     expect "*#" 
     } 
    -re {\mflash4\M} { 
     send "delete /force /recursive flash4:c3750-ipservicesk9-mz.122-55.SE5\r" 
     expect "*#" 
     send "delete /force /recursive flash4:c3750-ipservicesk9-mz.122-55.SE5.bin\r" 
     expect "*#" 
     } 
    -re {\mflash5\M} { 
     send "delete /force /recursive flash5:c3750-ipservicesk9-mz.122-55.SE5\r" 
     expect "*#" 
     send "delete /force /recursive flash5:c3750-ipservicesk9-mz.122-55.SE5.bin\r" 
     expect "*#" 
     } 
    -re {mflash6\M} { 
     send "delete /force /recursive flash6:c3750-ipservicesk9-mz.122-55.SE5\r" 
     expect "*#" 
     send "delete /force /recursive flash6:c3750-ipservicesk9-mz.122-55.SE5.bin\r" 
     expect "*#" 
     } 
    -re {\mflash7\M} { 
     send "delete /force /recursive flash7:c3750-ipservicesk9-mz.122-55.SE5\r" 
     expect "*#" 
     send "delete /force /recursive flash7:c3750-ipservicesk9-mz.122-55.SE5.bin\r" 
     expect "*#" 
     } 
    -re {\mflash8\M} { 
     send "delete /force /recursive flash8:c3750-ipservicesk9-mz.122-55.SE5\r" 
     expect "*#" 
     send "delete /force /recursive flash8:c3750-ipservicesk9-mz.122-55.SE5.bin\r" 
     expect "*#" 
     } 
    -re {\mflash9\M} { 
     send "delete /force /recursive flash9:c3750-ipservicesk9-mz.122-55.SE5\r" 
     expect "*#" 
     send "delete /force /recursive flash9:c3750-ipservicesk9-mz.122-55.SE5.bin\r" 
     expect "*#" 
     } 
} 

#This deletes the IOS from a single device, then tftps the IOS to flash. If the TFTP fails it tries one more time. 

send "copy tftp: flash1:\r" 
expect "Address or name of remote host []?" 
send "204.208.204.209\r" 
expect "Source filename []?" 
send "c3750-ipservicesk9-mz.122-55.SE7.bin\r" 
expect "Destination filename" 
send "\r" 
expect { 
    -re {\mtimed out\M} { 
     send "copy tftp: flash:\r" 
     expect "Address or name of remote host []?" 
     send "XXX.XXX.XXX.XXX\r" 
     expect "Source filename []?" 
     send "c3750-ipservicesk9-mz.122-55.SE7.bin\r" 
     expect "Destination filename [c3750-ipservicesk9-mz.122-55.SE7.bin]?" 
     send "\r" 
     expect "*#" 
     } 
    -re {\mOK - 13010154 bytes\M} 
} 


# checks to see if there are other members in the stack, and if there are it will copy the ios from flash1 to the other devices. 

send "dir ?\r" 
expect { 
    -re {\mflash\M} { 
     send "\r" 
     expect "*#" 
     } 
    -re {\mflash1\M} { 
     send "\r" 
     expect "*#" 
     } 
    -re {\mflash2\M} { 
     send "copy flash1:c3750-ipservicesk9-mz.122-55.SE7.bin flash2:\r" 
     expect "Destination filename" 
     send "\r" 
     expect "*#" 
     } 
    -re {\mflash3\M} { 
     send "copy flash1:c3750-ipservicesk9-mz.122-55.SE7.bin flash3:\r" 
     expect "Destination filename" 
     send "\r" 
     expect "*#" 
     } 
    -re {\mflash4\M} { 
     send "copy flash1:c3750-ipservicesk9-mz.122-55.SE7.bin flash4:\r" 
     expect "Destination filename" 
     send "\r" 
     expect "*#" 
     } 
    -re {\mflash5\M} { 
     send "copy flash1:c3750-ipservicesk9-mz.122-55.SE7.bin flash5:\r" 
     expect "Destination filename" 
     send "\r" 
     expect "*#" 
     } 
    -re {\mflash6\M} { 
     send "copy flash1:c3750-ipservicesk9-mz.122-55.SE7.bin flash6:\r" 
     expect "Destination filename" 
     send "\r" 
     expect "*#" 
     } 
    -re {\mflash7\M} { 
     send "copy flash1:c3750-ipservicesk9-mz.122-55.SE7.bin flash7:\r" 
     expect "Destination filename" 
     send "\r" 
     expect "*#" 
     } 
    -re {\mflash8\M} { 
     send "copy flash1:c3750-ipservicesk9-mz.122-55.SE7.bin flash8:\r" 
     expect "Destination filename" 
     send "\r" 
     expect "*#" 
     } 
    -re {\mflash9\M} { 
     send "copy flash1:c3750-ipservicesk9-mz.122-55.SE7.bin flash9:\r" 
     expect "Destination filename" 
     send "\r" 
     expect "*#" 
     } 
} 

다음은 파일을 파이프 할 때 스크립트의 출력입니다. 첫 번째 루프 만 캡처합니다.

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 

다음은 이러한 명령을 모두 수동으로 실행 한 경우의 예입니다.

B3762_6D205C_SW1&2#term length 0 
B3762_6D205C_SW1&2#wr 
Building configuration... 
[OK] 
B3762_6D205C_SW1&2#dir flash: 
# This first DIR tells me whether or not I have .bin version 5 or version 7. If I have version 7 I exit out of the script and I move on to upgrading another device. If it has version 5 continue on through the script. 
Directory of flash:/ 

    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  9240 Jun 18 2013 07:44:01 +02:00 multiple-fs 
    7 -rwx  43535 Jun 18 2013 07:44:01 +02:00 config.text 
    88 -rwx  2404 Apr 23 2012 02:35:18 +02:00 private-config.text.backup 
    8 -rwx  2404 Jun 18 2013 07:44:01 +02:00 private-config.text 

32514048 bytes total (19417088 bytes free) 
# This dir tells me how many flash file systems there are. I want to use this output to determine how many flash file systems I have to delete the old version 5 .bin file from. 
B3762_6D205C_SW1&2#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> 

B3762_6D205C_SW1&2#delete /force /recursive flash1:c3750-ipservicesk9-mz.122-55.SE5.bin 
B3762_6D205C_SW1&2#delete /force /recursive flash2:c3750-ipservicesk9-mz.122-55.SE5.bin 
B3762_6D205C_SW1&2#copy tftp: flash: 
Address or name of remote host []? 204.208.204.209 
Source filename []? c3750-ipservicesk9-mz.122-55.SE7.bin 
Destination filename [c3750-ipservicesk9-mz.122-55.SE7.bin]? 
Accessing tftp://204.208.204.209/c3750-ipservicesk9-mz.122-55.SE7.bin... 
Loading c3750-ipservicesk9-mz.122-55.SE7.bin from 204.208.204.209 (via Vlan402): !OO!OO!OO!OO!OO!OO!OO!OO!OO!OO!OO!OO!OO!OO!OO!OO!OO!OO!OO!OO!OO!OO!OO!OO!OO!OO!OO!OO!OO!OO!OO!O!OO!OO!OO!OOO!OO!OO!OO!OO!OO!OO!O!OO!OO!OO!OO!OO!OO!OO!OO 
[OK - 13010154 bytes] 

13010154 bytes copied in 281.312 secs (46248 bytes/sec) 
B3762_6D205C_SW1&2#dir ? 
# I want to use this "dir ?" to tell me I how many flash file systems I have to copy the new version 7 flash file system to. 
    /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#copy flash1:c3750-ipservicesk9-mz.122-55.SE7.bin flash2: 
Destination filename [c3750-ipservicesk9-mz.122-55.SE7.bin]? 
Copy in progress...CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 
13010154 bytes copied in 171.731 secs (75759 bytes/sec) 
B3762_6D205C_SW1&2#conf t 
Enter configuration commands, one per line. End with CNTL/Z. 
B3762_6D205C_SW1&2(config)#boot system switch all flash:c3750-ipservicesk9-mz.122-55.SE7.bin 
B3762_6D205C_SW1&2(config)#exit 
B3762_6D205C_SW1&2#reload at 02:00 22 June 

System configuration has been modified. Save? [yes/no]: yes 
Building configuration... 
[OK] 
Reload scheduled for 02:00:00 CEST Sat Jun 22 2013 (in 90 hours and 3 minutes) by super.poop on vty0 (204.208.XXX.XXX) 
Proceed with reload? [confirm] 
B3762_6D205C_SW1&2#term length 50 
B3762_6D205C_SW1&2#wr mem 
Building configuration... 
[OK] 
B3762_6D205C_SW1&2#exit 

이것은 현재 실패한 유일한 섹션입니다!

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 "*#" 
} 

답변

1

내가 말할 것이다 :

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 "*#" 
} 

많은 DRY 어. 물론 안된다.

+0

그래서 어떤 이유에서, 그것은 dir flash를하고 있습니다. (플래시와 flash1은 같은 디렉토리입니다. 번호가 매겨진 유일한 이유는 스택에서 작업중인 스위치를 식별하는 것입니다). 이전 .bin 파일을 삭제하거나 새 .bin 파일을 스택의 다른 구성원에 복사하지 않습니다. – bjforesthowell

+0

스크립트 상단에'exp_internal 1'을 추가하십시오. 기대는 당신에게 무슨 일이 일어나는지 보여줄 것입니다. –

+0

그냥 "dir?"을 계속 반복합니다. 실제로 번호가 지정된 플래시 디렉토리 즉, flash2, flash3 등을 찾고있는 withouth ... 나는 exp_internal의 출력을 파일로 파이프 처리했습니다. 여기에 게시 할 수있는 방법이 있습니까, 아니면 원래 게시물을 편집하여 거기에 올려 놓아야합니까? – bjforesthowell