عبارة شرطية يتوقع داخل أمر يسمى من برنامج نصي باش

StackOverflow https://stackoverflow.com/questions/1638369

  •  08-07-2019
  •  | 
  •  

سؤال

ولقد حاولت لأتمتة بعض النسخ الاحتياطي التكوين على أجهزتي سيسكو، ولقد تمكنت بالفعل للقيام بهذا السيناريو الذي يحقق هذه المهمة ولكن أحاول أن تحسينه لمعالجة الأخطاء أيضا.

وأعتقد أن من الضروري للقبض على الأخطاء على خطوتين، الأولى فقط بعد 'ترسل \ "$ تمريرة \ ص \"' للحصول على أخطاء تسجيل الدخول (تم رفض الوصول الرسائل) وفي 'نتوقع \ ": نهاية \" "الخط، للتأكد من أن الأوامر الصادرة كانت قادرة على سحب التكوين من الجهاز.

ولقد رأيت بعض الطرق للقيام بذلك إذا كنت تعمل على سيناريو توقعه، ولكن أريد أن استخدام برنامج نصي باش لتكون قادرة على توفير قائمة الأجهزة من ملف txt.

#!/bin/bash

data=$(date +%d-%m-%Y)
dataOntem=$(date +%d-%m-%Y -d "-1 day")
hora=$(date +%d-%m-%Y-%H:%M:%S)
log=/firewall/log/bkpCisco.$data.log
user=MYUSER
pass=MYPASS

for firewall in `cat /firewall/script/firewall.cisco`
do

VAR=$(expect -c "
spawn ssh $user@$firewall
expect \"assword:\"
send \"$pass\r\"
expect \">\"
send \"ena\r\"
expect \"assword:\"
send \"$pass\r\"
expect \"#\"
send \"conf t\r\"
expect \"conf\"
send \"no pager\r\"
send \"sh run\r\"
log_file -noappend /firewall/backup/$firewall.$data.cfg.tmp
expect \": end\"
log_file
send \"pager 24\r\"
send \"exit\r\"
send \"exit\r\"
")

echo "$VAR"
done
هل كانت مفيدة؟

المحلول

وتحتاج إلى أنماط بديلة في نتوقع البيانات التي تريد للقبض على الأخطاء. إذا كنت تبحث عن رسالة خطأ معينة يمكنك تحديد ذلك، بدلا من مجرد تحديد معالج المهلة التي سوف تؤدي في نهاية المطاف عندما فشل الانتاج الطبيعي أن تظهر.

وعلى سبيل المثال. بعد send \"$pass\r\" بدلا من محاولة expect \">\":

expect \">\" {} timeout {puts stderr {Could not log in}; exit}

وأي. إذا وصل الناتج المتوقع قبل المهلة (الافتراضي 10 ثانية) لا تفعل شيئا والاستمرار، ويشكو خلاف ذلك، والخروج من تتوقع. قد تحتاج أيضا إلى نمط الفولكلوري لتتناسب مع الحالة حيث ينتهي جلسة سه الخاص بك. لاحظ أنه منذ كنت لا تفعل أي استبدال متغير في توقعه، لا تحتاج \ "\" حول سلاسل الخاص بك، يمكنك استخدام {} أو حتى أي شيء عندما يكون كلمة واحدة، على سبيل المثال. expect conf وsend {no pager}.

وراجع للشغل وأنا أتفق مع bstpierre أن هذا سيكون أنظف إذا انخفض باش وفعل كل شيء في توقعه، ولكن إذا باش لا وظيفة هذا طيب.

نصائح أخرى

إذا كنت لا تستخدم علامات الاقتباس المفردة (expect -c '...')، ثم سوف يتم استبدال جميع المتغيرات $ من قبل باش لا نتوقع. قد يكون من الأسهل لوضع رمز نتوقع في ملف منفصل، أو ربما heredoc.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top