পরিবর্তনশীল বিস্তার এবং হেরেডোক সিনট্যাক্স মধ্যে escaping


0

আমি একটি সুইচ arp টেবিল আউট স্ক্র্যাপ নিম্নলিখিত স্ক্রিপ্ট পেয়েছেন। যাই হোক না কেন আমি কীভাবে সবকিছু এড়িয়ে চলার চেষ্টা করি, উদ্ধৃত করলাম নাকি অন্যথায় চেষ্টা করবো আমি সঠিকভাবে কাজ করতে পারব না। ইন্টারপ্রেটার অপেক্ষার মধ্যে পাস করা আগে bash লাইন আমার নিজের শেল দ্বারা ব্যাখ্যা করা হয়। আমি ব্যাচ লাইনটি আক্ষরিকভাবে স্যুইচ করতে চাইলে সেখানে যেতে চাই, কিন্তু আমাকে যেভাবেই থ্রিজিওক্টেট পরিবর্তনশীল কিছু বিন্দুতে প্রসারিত করতে হবে এবং আমি 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

আমি আপনার প্রশ্নের বিন্যাস ঠিক করার চেষ্টা করেছি; এটি চেক করুন এবং প্রয়োজনীয় হিসাবে পুনরায় সংশোধন করুন। (এছাড়াও, আমি UUOC পরিত্রাণ পেয়েছিলাম কারণ UUOC; এটি আপনাকে বড় হৃদরোগ দেয় যদি এটি আবার পরিবর্তন করুন।) আপনি থার্ডোওক্টেট সংজ্ঞায়িত করার চেষ্টা করেছেন কি? এবং সঙ্গে কি send "bash for i in ...? আপনি কি কখনো এমন কাজ করেছেন যা কাজ করতে পারে? যে একটি স্ক্রিপ্ট চেষ্টা করে যে এবং অন্য কিছুই না।
G-Man

এটি একটি স্ক্রিপ্ট কাজ না। Arista CLI সরাসরি যে ব্যাশ কমান্ড চালানো উদ্দেশ্যে উদ্দেশ্যে কাজ করে।
Brando__

আক্ষরিক টাইপিং bash (স্থান) for (স্থান) i ...?
G-Man

localhost # আমি জন্য bash seq 1 5; পিং-সি 1 10.199.1। $ i; PING সম্পন্ন 10.199.1.1 (10.199.1.1) 56 (84) তথ্য বাইট। 64 বাইট 10.199.1.1 থেকে: icmp_req = 1 টিটিএল = 64 সময় = 2.03 এমএস --- 10.199.1.1 পিং পরিসংখ্যান --- 1 প্যাকেট প্রেরণ করা হয়েছে, 1 পাওয়া গেছে, 0% প্যাকেট ক্ষতি, সময় 0ms rtt min / avg / max / mdev = 2.032 / 2.032 / 2.032 / 0.000 মিঃ পিং 10.199.1.2 (10.199.1.2) 56 (84) তথ্য বাইট। 10.199.1২ থেকে 64 বাইট: icmp_req = 1 ttl = 64 সময় = 2.76 ms .... localhost Yup, কাজ করে।
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. একক উদ্ধৃতি হেরডক, তাই শেল দ্বারা কোন ভেরিয়েবল প্রতিস্থাপিত হয় না
  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
    ...
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.