Первая проблема заключается в том, что оболочка не интерпретирует вложенные двойные кавычки, как вам может понадобиться. Самый простой способ исправить это - поместить программу Expect в одинарные кавычки. Этого будет достаточно, если в самой программе Expect нет одинарных кавычек.
Следующая проблема, с которой вы столкнетесь, состоит в том, что наличие всех шаблонов и действий в одной команде expect
будет обрабатывать их параллельно. На самом деле происходит то, что первый шаблон Password:
будет совпадать каждый раз, когда он видит эту строку (т.е. даже для пароля администратора во второй раз). Это будет проблемой, если два пароля должны быть разными. Как минимум, идентичные шаблоны должны входить в отдельные команды expect
, чтобы они могли выполняться последовательно. Эта проблема также влияет на шаблон Prompt#
, где вы ищете его три раза и хотите отправить три разных ответа.
Позже вы получите сообщение об ошибке после отправки первой команды очистки. Expect интерпретирует квадратные скобки внутри двойных кавычек таким же образом, как оболочки интерпретируют $()
или ``
(т.е. подстановка команд). Вы увидите ошибку, подобную этой:
invalid command name "confirm"
while executing
"confirm"
invoked from within
"expect {
⋮
Он пытается запустить confirm
как команду Tcl (или Expect). Вы можете использовать фигурные скобки ({}
), чтобы Tcl не делал эту интерпретацию. Кроме того, ожидаемые шаблоны по умолчанию обрабатываются как «глобальные» выражения (то есть как подстановочные знаки оболочки), поэтому даже если вы напишите {[confirm]}
в качестве шаблона, он все равно не будет использоваться для точного совпадения строки (он будет соответствовать любому отдельному символу c
, o
, n
, f
, i
, r
или m
). Вы должны использовать флаг -ex
, чтобы отметить шаблон для точного соответствия.
Исправьте эти проблемы, отбросьте ненужные цитаты, и вы можете получить что-то вроде этого:
#!/bin/sh
VAR=$(expect -c '
proc abort {} {
puts "Timeout or EOF\n"
exit 1
}
spawn telnet 1.1.1.1
expect {
Password: { send "password1\r" }
default abort
}
expect {
Prompt> { send "en\r"; exp_continue }
Password: { send "password2\r" }
default abort
}
expect {
Prompt# { send "clea line 10\r"; exp_continue }
-ex {[confirm]} { send "Y\r" }
default abort
}
expect {
Prompt# { send "clea line 11\r"; exp_continue }
-ex {[confirm]} { send "Y\r" }
default abort
}
expect {
Prompt# { send "exit\r"; exp_continue }
timeout abort
eof
}
puts "Finished OK\n"
')
echo "$VAR"