Expansão variável e escape na sintaxe heredoc

0

Eu tenho o seguinte script para raspar a tabela arp de um switch. Não importa o quanto eu tente escapar de tudo, cite ou tente de outra maneira, não consigo fazer com que funcione corretamente. A linha bash é interpretada pelo meu próprio shell antes de ser passada para o interpretador Esperar. Eu quero que a linha bash seja passada literalmente como é para o switch ser executado lá, mas eu preciso de alguma forma obter a variável $ thirdoctet expandida em algum ponto e eu quero que o ssh @ {ip} seja expandido.

O bas da Arista não parece gostar de definir variáveis. Não consegui definir thirdoctet = 3 dentro.

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/\(.*\)\./ /'        arista-arp.csv > tmp && mv tmp arista-arp.csv 

sed 's/\(.*\)\./ /'        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
    
por Brando__ 06.09.2016 / 15:49

1 resposta

0

O problema é que você tem variáveis que você espera que sejam substituídas em momentos diferentes (mesmo em servidores diferentes), mas você codificou o script para que eles sejam todos substituídos uma vez, quando a função bash é executada. Um bash aqui-doc age como uma string entre aspas duplas, portanto, todas as variáveis $ip , $thirdoctet e $i são substituídas antes que o texto do heredoc seja entregue ao comando expect. Parece que você deseja que $ip e $thirdoctet sejam expandidos, mas não $i . Você precisará ser um pouco mais inteligente em citações.

Eu faria isso:

  1. cite o heredoc, para que nenhuma variável seja substituída pelo shell
  2. exporte as variáveis $ip e $thirdoctet para que seja possível acessá-las.
  3. escape da variável $i , de forma que ela seja apenas substituída por bash na máquina remota
  4. você esqueceu de "apertar enter" - faltando \r em alguns comandos de envio
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
    ...
    
por 06.09.2016 / 19:12