У меня есть следующий скрипт для очистки таблицы 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 ответ1

0

Проблема в том, что у вас есть переменные, которые вы ожидаете заменить в разное время (даже на разных серверах), но вы закодировали скрипт так, чтобы все они подставлялись один раз при запуске функции bash. Документ bash here-doc действует как строка в двойных кавычках, поэтому все переменные $ip , $thirdoctet и $i подставляются перед передачей текста heredoc команде ожидаемого. Похоже, вы хотите, чтобы $ip и $thirdoctet были расширены, но не $i . Вы должны быть немного умнее, когда цитируете.

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .