Das Problem ist, dass Sie Variablen haben, von denen Sie erwarten, dass sie zu unterschiedlichen Zeiten (auf verschiedenen Servern) ersetzt werden. Sie haben das Skript jedoch so codiert, dass sie alle einmal ersetzt werden, wenn die bash-Funktion ausgeführt wird. Ein heftiger Schlag heredoc wirkt wie ein doppeltes Anführungszeichen, so dass alle Variablen $ip
, $thirdoctet
und $i
ersetzt werden, bevor der Text des heredoc ist mit dem Befehl erwarten übergeben. Es scheint, dass Sie wollen $ip
und $thirdoctet
nicht erweitert werden möchten $i
. Sie müssen ein bisschen schlauer beim Zitieren sein.
Ich würde das machen:
- Setzen Sie das Heredoc in Anführungszeichen, damit keine Variablen durch die Shell ersetzt werden
- Exportieren Sie die Variablen
$ip
und$thirdoctet
, damit sie darauf zugreifen können. - Flucht die
$i
Variable, so dass sie auf dem Remote-Computer nur durch Bash ersetzt wird - Sie haben vergessen, "Enter" zu drücken -
\r
in ein paar Sendebefehlen fehlen
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 ...