heredoc 구문에서 변수 확장 및 이스케이프


0

스위치의 arp 테이블을 긁어내는 다음 스크립트가 있습니다. 내가 어떻게 모든 것을 피하려고 시도하든, 인용하거나 그렇지 않으면 제대로 작동하지 않습니다. bash 라인은 Expect 인터프리터로 전달되기 전에 내 쉘에서 해석됩니다. bash 줄을 문자 그대로 전달하여 스위치가 실행되도록하고 싶지만 어떻게 든 $ thirdoctet 변수를 확장해야하고 ssh @ {ip}을 확장하고 싶습니다.

Arista의 bash는 변수 설정을 좋아하지 않는 것 같습니다. 내부에서 thirdoctet = 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

귀하의 질문 형식을 수정하려고 시도했습니다. 확인 후 필요에 따라 수정하십시오. (또한 UUOC 때문에 UUOC를 제거했습니다. 중대한 가슴 앓이가 생기면 다시 변경하십시오.) 셋째 옥텟을 정의하려고 무엇을 했습니까? 그리고 무엇 send "bash for i in ...입니까? 그런 일을 해 본 적이 있습니까? 그렇게하는 스크립트를 시도하십시오.
G-Man

스크립트에서는 작동하지 않습니다. arista CLI에서 해당 bash 명령을 직접 실행하면 의도 한대로 작동합니다.
Brando__

말 그대로 bash(공백) for(공백) i...?
G-Man

i에 대한 localhost # bash seq 1 5; ping -c 1 10.199.1. $ i; PING 10.199.1.1 (10.199.1.1) 56 (84) 바이트의 데이터를 완료했습니다. 10.199.1.1에서 64 바이트 : icmp_req = 1 ttl = 64 시간 = 2.03ms --- 10.199.1.1 핑 통계 --- 1 개의 패킷 전송, 1 개의 수신, 0 % 패킷 손실, 시간 0ms 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) 바이트의 데이터. 10.199.1.2에서 64 바이트 : icmp_req = 1 ttl = 64 time = 2.76ms .... localhost 예, 작동합니다.
Brando__

(1) 좋아, 나는 조금 놀랐다. 그러나 나는 그것을 당신의 말로 받아 들일 것이다. (2) 힌트 : 의견에 여러 줄로 표시해야하는 내용을 게시하지 마십시오. `방법을 알기 전까지는 주석에 포함 된 내용을 게시하지 마십시오 . (3) 당신은 아마도 문제가있을 것입니다 $(그러나 당신은 이미 알고 있지 않습니까?) 당신은 간단한 것을 bash for i in 1 2 3 4 5 6 7 8; do echo buffalo; done통해 할 수 있습니까 expect?
G-Man

답변:


0

문제는 다른 시간에 (다른 서버에서도) 대체 될 것으로 예상되는 변수가 있지만 bash 함수가 실행될 때 스크립트가 모두 대체되도록 스크립트를 코딩했다는 것입니다. 떠들썩한 파티 히어 닥은 이중 인용 된 문자열, 그래서 모든 변수와 같은 역할을 $ip, $thirdoctet그리고 $i히어 닥의 텍스트가 기대 명령에 인도되기 전에 대체됩니다. 당신이 원 $ip하고 $thirdoctet확장되지만 보이지는 않는 것 같습니다 $i. 인용에 대해 조금 더 똑똑해야합니다.

나는 이것을 할 것이다 :

  1. 변수를 쉘로 대체하지 않도록 heredoc을 작은 따옴표로 묶으십시오.
  2. 을 수출 $ip하고 $thirdoctet변수가 너무 액세스 할 수 있습니다 기대합니다.
  3. $i변수를 이스케이프하면 원격 시스템에서 bash로만 대체됩니다.
  4. "enter"를 누르는 것을 잊어 버렸습니다 \r. 두 개의 send 명령에서 누락 되었습니다.
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
    ...
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.