Variable Erweiterung und Flucht in Heredoc-Syntax

1260
Brando__

Ich habe das folgende Skript, um die Arp-Tabelle eines Switches auszukratzen. Egal wie ich versuche, alles zu entkommen, es zu zitieren oder anderweitig zu versuchen, ich kann es nicht richtig funktionieren lassen. Die bash-Zeile wird von meiner eigenen Shell interpretiert, bevor sie an den Expect-Interpreter übergeben wird. Ich möchte, dass die Bash-Zeile buchstäblich übergeben wird, da der Switch dort ausgeführt wird, ABER ich muss die $ thirdoctet-Variable irgendwie erweitert bekommen, und ich möchte, dass ssh @ erweitert wird.

Aristas Bash scheint das Setzen von Variablen nicht zu mögen. Ich konnte dritteroktet = 3 nicht innerhalb definieren.

function get-arp { echo $  /usr/bin/expect > arista-arp-dump-$ << EOF spawn ssh admin@$ expect "assword: " send "password\r" expect "localhost>"  send "bash for i in `seq 1 5`; do ping -c 1 10.$thirdoctet.1.$i; done" expect "localhost>" send "bash for i in `seq 10 19`; do ping -c 1 10.$thirdoctet.1.$i; done" expect "localhost>" send "show ip arp\r" expect "localhost>" send "exit\r" expect "eof" EOF  tail -n +2 arista-arp-dump-$ | grep b8ae | awk '' | tr ' ' ',' > arista-arp.csv  sed 's/\(.*\)\./\1 /' arista-arp.csv > tmp && mv tmp arista-arp.csv   sed 's/\(.*\)\./\1 /' arista-arp.csv > tmp && mv tmp arista-arp.csv  sed '/^$/d;s/[[:blank:]]//g' arista-arp.csv > tmp && mv tmp arista-arp.csv  rm arista-arp-dump-$  }  get-arp 
0
Ich habe versucht, die Formatierung Ihrer Frage zu korrigieren. Bitte überprüfen Sie es und korrigieren Sie es bei Bedarf. (Außerdem habe ich die UUOC wegen UUOC losgeworden; ändern Sie sie wieder, wenn Sie dadurch heftiges Sodbrennen bekommen.) Was haben Sie versucht, Thirdoctet zu definieren? Und was ist mit sende "bash for i in ..."? Haben Sie jemals so etwas zum Arbeiten bekommen? Versuchen Sie ein Skript, das dies tut, und nichts anderes. G-Man vor 8 Jahren 0
Es hat nie in einem Skript gearbeitet. Das Ausführen dieses Bash-Befehls direkt in der arista-CLI funktioniert wie vorgesehen. Brando__ vor 8 Jahren 0
Wörtlich "bash" (Leerzeichen) eingeben "for" (Leerzeichen) "i" ...? G-Man vor 8 Jahren 0
localhost # bash für i in `seq 1 5`; ping -c 1 10.199.1. $ i; done PING 10.199.1.1 (10.199.1.1) 56 (84) Datenbytes. 64 Bytes von 10.199.1.1: icmp_req = 1 ttl = 64 Zeit = 2,03 ms --- 10.199.1.1 Ping-Statistik --- 1 übertragene Pakete, 1 empfangen, 0% Paketverlust, Zeit 0 ms rtt min / avg / max / mdev = 2.032 / 2.032 / 2.032 / 0.000 ms PING 10.199.1.2 (10.199.1.2) 56 (84) Datenbytes. 64 Bytes von 10.199.1.2: icmp_req = 1 ttl = 64 time = 2,76 ms ... localhost Yup, funktioniert. Brando__ vor 8 Jahren 0
(1) OK, ich bin ein wenig überrascht, aber ich nehme dein Wort dafür. (2) Hinweis: Veröffentlichen Sie keine Dinge, die in Kommentaren mehrere Zeilen enthalten sollten. Veröffentlichen Sie nicht Dinge, die `\` `in Kommentaren enthalten, bis Sie wissen, wie das geht. (3) Sie haben wahrscheinlich ein Problem mit dem "$" (aber Sie haben es bereits gewusst, nicht wahr?) Können Sie etwas einfaches wie "bash" für i in 1 2 3 4 5 6 7 8 machen; Echo Büffel; erledigt durch "erwarten"? G-Man vor 8 Jahren 0

1 Antwort auf die Frage

0
glenn jackman

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, $thirdoctetund $iersetzt werden, bevor der Text des heredoc ist mit dem Befehl erwarten übergeben. Es scheint, dass Sie wollen $ipund $thirdoctetnicht erweitert werden möchten $i. Sie müssen ein bisschen schlauer beim Zitieren sein.

Ich würde das machen:

  1. Setzen Sie das Heredoc in Anführungszeichen, damit keine Variablen durch die Shell ersetzt werden
  2. Exportieren Sie die Variablen $ipund $thirdoctet, damit sie darauf zugreifen können.
  3. Flucht die $iVariable, so dass sie auf dem Remote-Computer nur durch Bash ersetzt wird
  4. Sie haben vergessen, "Enter" zu drücken - \rin 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 ...