Цель следующего простого сценария ожидания - получить имя хоста имя на удаленной машине
Иногда ожидайте, что скрипт не выполнит ssh для $ IP_ADDRESS (поскольку удаленная машина не активна и т. Д.)
так что в этом случае ожидаемый сценарий прервется через 10 секунд (таймаут 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.