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

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

Иногда ожидается, что сценарий не сможет выполнить ssh до $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 ответа

Решение

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

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

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.

Другие вопросы по тегам