Проблема в том, что у вас есть переменные, которые вы ожидаете заменить в разное время (даже на разных серверах), но вы закодировали скрипт так, чтобы все они заменялись один раз, когда запускается функция bash. Баш Heredoc действует как двойные кавычки строки, так что все переменные $ip
, $thirdoctet
и $i
заменяется перед текстом Heredoc передается команде ожидать. Кажется, что вы хотите $ip
и $thirdoctet
должны быть расширены, но нет $i
. Вы должны быть немного умнее, когда цитируете.
Я бы сделал это:
- одиночный кавычка heredoc, так что никакие переменные не заменяются оболочкой
- экспортировать
$ip
и$thirdoctet
переменные поэтому ожидать доступа к ним. - экранируйте
$i
переменную, чтобы она заменялась только bash на удаленной машине - Вы забыли «нажать Enter» - отсутствует
\r
в паре команд отправки
function get-arp { export ip export thirdoctet # note the quotes: ........................v...v /usr/bin/expect > arista-arp-dump-$ << 'EOF' # use the 'ip' variable from the environment spawn ssh admin@$env(ip) expect "assword: " send "password\r" expect "localhost>" # use the 'thirdoctet' variable from the environment and escape `\$i` send "bash for i in `seq 1 5`; do ping -c 1 10.$env(thirdoctet).1.\$i; done\r" expect "localhost>" send "bash for i in `seq 10 19`; do ping -c 1 10.$env(thirdoctet).1.\$i; done\r" expect "localhost>" send "show ip arp\r" expect "localhost>" send "exit\r" expect "eof" EOF ...