Расширение и экранирование переменных в синтаксисе 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, Вы должны быть немного умнее, когда цитируете.

Я бы сделал это:

  1. одиночный кавычки heredoc, так что никакие переменные не заменяются оболочкой
  2. экспортировать $ip а также $thirdoctet переменные, ожидаемые, могут получить к ним доступ
  3. избежать $i переменная, поэтому она заменяется только bash на удаленной машине
  4. Вы забыли "нажать 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
    ...
Другие вопросы по тегам