Назад | Перейти на главную страницу

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

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

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

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

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

  1. Ожидайте, что сценарий успешно выполнит ssh и выполнил команду hostname на удаленном компьютере
  2. Ожидайте прерывания скрипта, потому что тайм-аут составлял 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

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

Вы ожидаете, что заявление может стать

expect {
    ")?"    { send "yes\r"  ; exp_continue  }
    word:   { send $PASS\r}
    timeout { puts "failed to SSH" }
       } 

Я знаю, что это не совсем то, о чем вы спрашивали, но я хотел бы предложить альтернативу. Используйте ключи ssh вместо паролей и сценарии bash вместо Expect:

output=$(ssh -o ConnectTimeout=10 -o BatchMode=yes -o StrictHostKeyChecking=no $IP_ADDRESS "hostname")

if [ $? -eq 255 ]; then
    # Some error occured while attempting to connect.
else
    # Success!
fi

Это явно не говорит о том, что был тайм-аут, не удалось войти в систему с закрытым ключом и т. Д., Но это лучше, чем писать Expect.