Расширение и экранирование переменных в синтаксисе heredoc
У меня есть следующий скрипт для очистки таблицы arp коммутатора. Независимо от того, как я пытаюсь избежать всего, процитировать или иным образом попытаться, я не могу заставить его работать должным образом. Строка bash интерпретируется моей собственной оболочкой перед передачей в интерпретатор Expect. Я хочу, чтобы строка bash передавалась буквально, как и для переключателя, который там выполняется, НО мне нужно каким-то образом расширить переменную $thirdoctet в какой-то момент, и я хочу, чтобы ssh@{ip} был расширен.
Кажется, Аристе не нравится устанавливать переменные. Я не смог определить третий октет =3 внутри.
function get-arp {
echo ${ip}
/usr/bin/expect > arista-arp-dump-${ip} << EOF
spawn ssh admin@${ip}
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-${ip} | grep b8ae | awk '{print $1,$3}' | 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-${ip}
}
get-arp
1 ответ
Проблема в том, что у вас есть переменные, которые вы ожидаете заменить в разное время (даже на разных серверах), но вы закодировали скрипт так, чтобы все они заменялись один раз, когда запускается функция bash. Документ bash here-doc действует как строка в двойных кавычках, поэтому все переменные $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-${ip} << '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
...