Не удается найти канал с именем "" Expect Script - PullRequest
0 голосов
/ 19 марта 2020

У меня есть два сценария, которые я использую вместе. Это потому, что у меня есть большое количество команд, которые необходимо отправлять маршрутизаторам / коммутаторам большими партиями.

Полное раскрытие Я не писал эти сценарии, они были написаны кем-то, кто больше не работает со мной, и я очень мало знаю об ожиданиях.

Первый сценарий (сценарий A) - это то, что позволяет мне выполнять сценарий сразу на нескольких устройствах из центрального блока, одновременно выводя результаты сценария в файл.

#!/bin/bash

let j=0;
let sleeptime=20;
let numberInstance=20;
if [ $# -lt "3" ]
then
    echo "Missing Parameters:"
    echo "start <script-name> <output-directory> <sites-file>"
    exit 1
fi


for s in `cat ${3}`
do

        echo Processing: $s on `date`;
        ./$1 ${s}${4}  > ./$2/${s}-${4} &
        let j+=1;


if [ `expr $j % $numberInstance` -eq 0 ]
        then
echo sleeping for ${sleeptime} seconds...sites processed: $j;
                sleep $sleeptime;
fi
done

Второй сценарий (сценарий B) - это ожидаемый сценарий, который порождает и запускает сеанс S SH на устройстве и отправляет список команд на устройство.

Это работает просто отлично, но в тех случаях, когда оно не может достичь Сценарий устройства A возвращает ошибку из сценария B:

$ ./start_sw_FAST LH108_S2 Results/LH108_S2 inputlist   
Processing: Site1 on Thu Mar 19 14:31:07 EDT 2020
Processing: Site2 on Thu Mar 19 14:31:07 EDT 2020
Processing: Site3 on Thu Mar 19 14:31:07 EDT 2020
Processing: Site4 on Thu Mar 19 14:31:07 EDT 2020
$ can not find channel named ""
    while executing
"send "edit\r""
    (file "./LH108_S2" line 69)
can not find channel named ""
    while executing
"send "edit\r""
    (file "./LH108_S2" line 69)
can not find channel named ""
    while executing
"send "edit\r""
    (file "./LH108_S2" line 69)

В этом случае я знаю, что эти местоположения потерпят неудачу. Но когда я запускаю это на сотнях одновременно, мне бы хотелось, чтобы в подсказке было что-то вроде:

Failed to execute script on Site1.
Failed to execute script on Site2.
Failed to execute script on Site3.
Failed to execute script on Site4.

Я не уверен, как я могу заставить Сценарий А знать о Сценарии Сбои Б.

1017 * Ожидаемый сценарий:
#!/usr/bin/expect

proc _jgetRouterIPs {} {
set file [open router-list r]
  while {![eof $file]} {
               set buff [read $file ]
              }
close $file
return $buff
}

proc ssh2rtr { rtr usr pwd } {
 spawn ssh -l $usr $rtr;
set sess_id $spawn_id;
set ppret [ processPrompts $rtr $usr $pwd $sess_id 0 ];
if { $ppret == 0 } {
return $spawn_id;
else { return -1;}
}}


proc processPrompts { rtr usr pwd sess_id status } {
      set timeout 666;
      set spawn_id $sess_id;
      set fw_prompt  {\nuser@[0-9]{4}\-[A-Z]{2}-S2[>|#]{1}};
      set fwprompt1  {user@[0-9]{4}-[A-Z]{2}-S2\%\s};

if { $status < 2 } {
      expect {
      -re $fw_prompt { return 0;}
      -re $fwprompt1 {send "cli\r"; return 0;}

      "no)?" {  send "yes\r";
       processPrompts $rtr $usr $pwd $sess_id 0;
        }


      "assword:" {
                send "${pwd}\r";
       if { $status} { return 1;}
       processPrompts $rtr $usr $pwd $sess_id 1;

        }

     timeout     { send_user "\nTimeout on SSH!!!\n"; return 8; } ;#no response from telnet/ssh
     default     { send_user "\nSSH Unknown Error!!!\n"; return 9;  } ;#unknown error has occurred.
} ;#end expect 
} ;#end if
}



set site [lindex $argv 0];
set sw1 "${site}s1";
set sw2 "${site}s2";
set fw "${site}fw1";
set fw_prompt  {\nuser@[0-9]{4}\-[A-Z]{2}-S2[>#]{1}};
set fw_prompt1  {user@[0-9]{4}-[A-Z]{2}-S2%\s};

set sshret  [ ssh2rtr $sw2 user NotMyPassword ]
if { $sshret != -1 } {
                set spawn_id $sshret;
} else {
                send_user "Error Connecting...!!!";
}
        set timeout 666;


send "edit\r";
expect -re $fw_prompt;
send "rollback\r";
expect -re $fw_prompt;
*more commands will go here*

1 Ответ

0 голосов
/ 19 марта 2020

это обычный WTF с ожидаемым, когда вы используете spawn в про c. Обратите внимание на одно из предостережений на странице справочника ожидаемого:

Ожидается довольно либеральный взгляд на область видимости. В частности, переменные, считываемые командами, указывающими c программе Expect, будут сначала искать в локальной области, а если не найдены, в глобальной области. Например, это избавляет от необходимости помещать «глобальное время ожидания» в каждую написанную вами процедуру, которая ожидает. С другой стороны, записанные переменные всегда находятся в локальной области (если не была введена «глобальная» команда). Наиболее распространенная проблема, которую это вызывает, - когда в процедуре выполняется spawn. Вне процедуры spawn_id больше не существует, поэтому порожденный процесс больше не доступен просто из-за области видимости. Добавить «global spawn_id» к такой процедуре.

...