ожидать + как определить, если ожидать перерыва, потому что время ожидания? - PullRequest
4 голосов
/ 11 марта 2012

Цель следующего простого ожидаемого сценария - получить имя hostname на удаленной машине

Иногда ожидается, что сценарий не сможет выполнить ssh to $ IP_ADDRESS (поскольку удаленная машина не активна,и т.д.)

, поэтому в этом случае ожидаемый сценарий будет прерываться через 10 секунд (время ожидания 10), это нормально, но ......

Есть два варианта

  1. Ожидается, что сценарий успешно выполнит ssh и выполнил команду hostname на удаленном компьютере.
  2. Ожидает прерывание сценария, поскольку время ожидания составило 10 секунд.*
    • в случае успешного ожидания ssh будет прерываться через 0,5-1 секунду, а в случае плохого ssh - через 10 секунд

    , но я не знаю, ожидаете ли выскрипт выполняет ssh успешно или нет?

    возможно ли определить время ожидания?или чтобы убедиться, что ожидание закончилось из-за тайм-аута?

    Отметить версию моей машины для Linux - red-hat 5.1

    Ожидается сценарий

     [TestLinux]# get_host_name_on_remote_machine=`cat << EOF
      > set timeout 10
      > spawn  ssh   $IP_ADDRESS
      >            expect {
      >                      ")?"   { send "yes\r"  ; exp_continue  }
      > 
      >                      word:  {send $PASS\r}
      >                   }
      > expect >  {send "hostname\r"}
      > expect >    {send exit\r}
      > expect eof
      > EOF`
    

    Пример, если у нас нет подключения к удаленному хосту

     [TestLinux]# expect -c  "$get_host_name_on_remote_machine"
     spawn ssh 10.17.180.23
     [TestLinux]# echo $?
     0
    

Ответы [ 2 ]

15 голосов
/ 12 марта 2012

Чтобы сделать разумные вещи по тайм-ауту, вы должны сказать ожидайте, что должно произойти:

set timeout 10
expect {
    ")?"     { send "yes\r"  ; exp_continue  }
    "word:"  { send "$PASS\r"                }
    timeout  { puts "timed out during login"; exit 1 }
}
set timeout -1   ; # Infinite...
expect ">"   { send "hostname\r"             }
expect ">"   { send "exit\r"                 }
expect eof
exit

Обратите внимание выше, как я использую exit 1, когда я сталкиваюсь с ошибкой. Ваша оболочка сможет получить это через $? и т. Д. (Без аргумента 1 команда exit приведет к успешному завершению работы скрипта; то же самое произойдет, если вы опустите нижнюю часть скрипт.)

4 голосов
/ 11 марта 2012

Не совсем отвечаю на первоначальный вопрос, но почему вы общаетесь с SSH в интерактивном режиме, когда вы просто можете передать ему скрипт для выполнения?В конце концов, это оболочка.

Я имею в виду, просто запустите:

ssh user@host '/usr/bin/hostname'

, и ssh удаленно вызовет команду hostname и подключит свой стандартный вывод к стандартному выводу процесса, который породил ssh.

Возвращаясь к делу - этот выглядит как пример того, как привязать действие к условию тайм-аута.

...