Tcl لـ Cisco IOS في أمثلة بسيطة

تخيل أنك تحتاج إلى نشر العشرات من مفاتيح الوصول إلى Cisco من نفس النوع من البداية. يتضمن التكوين النموذجي اسم مضيفًا ومجالًا ، وبوابة افتراضية ، وكلمات مرور ، وقائمة من المستخدمين ، وعناوين IP لـ SVI ، وأرقام VLAN ، وإعدادات جذوع الوصلة الصاعدة ، إلخ. لدخوله في كل مرة بيديك طويلة جدا وغير مثمرة. بالطبع ، يمكنك إنشاء تكوين نموذجي وتحميله عبر (T) FTP ، ولكن أولاً ، سيتطلب ذلك على الأقل تكوينًا أدنى من وحدة التحكم ، وثانياً ، لا يزال يتعين تغيير معلمات التكوين القابلة للتغيير. لحل هذه المهام (بالإضافة إلى العديد من المهام الأخرى) ، يحتوي Cisco IOS على أداة أتمتة قوية - مترجم Tcl مضمن (Cisco IOS scripting w / Tcl).

ما هو Tcl


Tcl (للقراءة "دغدغة" ، وأحيانًا "متدفق") هي لغة برمجة مترجمة تم تطويرها في أواخر الثمانينيات لتضمينها في تطبيقات وحدة التحكم. مجموعة ميزات Tcl الحديثة واسعة للغاية: هنا يوجد دعم لـ OOP ، وأدوات متقدمة للتراجع ، صفائف ديناميكية ، إلخ.

ظهر دعم هذه اللغة أولاً على نظام Cisco IOS 12.2 (3) T (يشار في بعض المصادر إلى 12.3 (2) ، لكنني لم أجد تأكيدًا لهذا) ولديّ حاليًا عدة خيارات:

  • Tcl مترجم مع واجهة سطر الأوامر. إنه مدمج في إصدارات مختلفة من نظام Cisco IOS ، بما في ذلك IOS XE و XR ، وهو متاح لمجموعة واسعة من الأجهزة. يتيح لك تنفيذ أوامر Tcl ، تشغيل البرامج النصية الجاهزة كملفات ، إلخ. الأجهزة التي لا تستخدم نظام التشغيل iOS كنظام تشغيل ولكن على سبيل المثال ، Cat OS أو ASA (في جدار الحماية الذي يحمل نفس الاسم) لا تحتوي على سطر أوامر مترجم.
  • ما يسمى "مدير الأحداث المدمج" أو EEM - نظام تتبع الأحداث الذي يسمح لك بالرد عليها تلقائيًا في الوقت الفعلي. على سبيل المثال ، راقب مضيفًا عن بُعد بإشعار البريد الإلكتروني. تتم كتابة البرامج النصية EEM (تطبيقات صغيرة) في Tcl ، ولكن EEM نفسه لا يوفر سطر أوامر Tcl منفصل. مثال للاستخدام انظر هنا . يتوفر EEM على منصات Nexus (NX OS) و ASA من الإصدار 9.2 (1) والإصدارات الأحدث.
  • أنظمة القائمة الصوتية IVR (الرد الصوتي التفاعلي).

كيفية تحديد وجود مترجم أوامر معرفة طراز الجهاز أو إصدار نظام التشغيل iOS؟ يوجد Cisco Feature Navigator لهذا :

صورة

يسمح لك عنصر القائمة " ميزات الميزات البحثية " بتحديد إصدار IOS محدد لإصدار تدريب IOS معين أو نظام أساسي معين للأجهزة. يسمح لك عنصر قائمة Research Software بالبحث عن كافة إصدارات iOS مع دعم Tcl لجهاز معين. نقر ، وقم بترشيح حقل التصفية حسب الاسم (اسم الميزة) "Cisco IOS scripting w / Tcl" (أو ببساطة "Tcl") ، وقم بإضافة اسم الميزة إلى القائمة ، وحدد Train release واحصل على قائمة بجميع إصدارات IOS التي تحتوي على هذه الميزة:



لسوء الحظ ، قاعدة بيانات CFN غير مكتملة وأحيانًا لا تُظهر جميع المعلومات. لذلك ، بالنسبة للنظام الأساسي CAT2960S ، أظهر المستكشف وجود Tcl في إصدار IOS 15.2E1 ولم يظهر في الإصدار 15.2E9 ، على الرغم من أن مترجم Tcl موجود بالفعل وهناك.

ما الذي يمكن عمله في Cisco IOS باستخدام Tcl؟ كثير جدًا: تصفح وتغيير التكوين ، وإنشاء نصوص تفاعلية ، والعمل على كائنات MIB ، ومآخذ TCP و UDP ، وحتى ... كتابة غلاف ويب كامل!

بشكل عام ، يحتوي برنامج Tcl على سلسلة من الأوامر مفصولة بخط جديد أو فاصلة منقوطة. مثال غير توضيحي:

puts "Hello, world!"; puts "My first Tcl IOS script!" 

بعض المشغلين:

# تعليق إلى نهاية السطر
set a 1 مهمة 1 = 1
الحصول على قيمة متغير
{ } عبارة الكتلة - تحدد نص الحلقة أو الشرط
[ ] مشغل الاستبدال - عند التنفيذ ، بدلاً من الأقواس المربعة ، سيتم استبدال القيمة المحسوبة للتعبير الوارد فيها
== <= <> عوامل المقارنة
puts "text" يعرض السلسلة "نص" في stdout (أي إلى وحدة التحكم)
puts $a مشابه لقيمة a
gets stdin يقرأ القيم من وحدة التحكم
set a [gets stdin] إدخال قيمة من وحدة التحكم وتعيين المتغير الخاص به
for {set i 1} {$i < 10} {inrc i} {....} للحلقة
proc {argument, ....} {body} method

للحصول على قائمة أكثر اكتمالا ، راجع progopedia.ru/language/tcl

يتم تشغيل مترجم Tcl بواسطة الأمر tclsh من وضع EXEC ذي الامتيازات:

 sw#Tclsh sw(tcl)# 

قم بتشغيل البرنامج النصي الأول:

صورة

الخروج من المترجم هو أمر tclquit أو مجرد الخروج. Tcl حساس لحالة الأحرف ، لذلك Puts "Hello, world" سيرمي خطأً ، لكن سجل shell لقذيفة IOS ليس مهمًا. تتم معالجة جميع أوامر الإدخال أولاً بواسطة مترجم Tcl ، إذا كان أمر الإدخال قابل للتنفيذ مع ذلك. Tcl ، ينفذ والنتيجة هي الإخراج إلى جهاز TTY. إذا تعذر تنفيذ الأمر بواسطة المترجم الفوري ، يتم تمريره إلى محلل أوامر IOS. وبالتالي ، يمكن أن يجمع نص واحد بين عبارات Tcl وأوامر IOS. لا تحتوي بيئة IOS على محرر نص كامل ، لذلك يجب إنشاء نصوص محددة مسبقًا بوسائل خارجية وعندئذٍ فقط يتم نسخها إلى الفلاش أو الذاكرة. كما أنه يدعم التجميع المسبق للبرنامج النصي في الرمز البريدي مع الإطلاق اللاحق. يتم تنفيذ إطلاق ملف البرنامج النصي بواسطة الأمر

 tclsh flash:filename 

يُسمح بجلسات مترجم Tcl متعددة من جلسات TTY مختلفة.

أوامر Tcl مترجم داخلي:
exec - ينفذ الأمر المقتبس من مجموعة EXEC ذات الامتيازات الخاصة بـ IOS CLI.
sw(tcl)#exec "show int fa0" :

صورة

ios-config - ينفذ أمرًا من وضع التكوين العام. وراءه ، في علامات اقتباس منفصلة ، تتم الإشارة إلى جميع أوامر التكوين الفرعية التالية. على سبيل المثال:
sw(tcl)#ios_config "int fa0" "ip address 192.168.0.1 255.255.255.0" "no shut"
أي ما يعادل سلسلة من أوامر iOS:

 sw#conf te sw(config)#int fa0 sw(conf-int)#ip address 192.168.0.1 255.255.255.0 sw(conf-int)#no shut 

يمنع مترجم Tcl عمليات exec من التفاعل مباشرة مع وحدة التحكم. لذلك ، يحدث نقل البيانات إلى عمليات التنفيذ التي يتم إطلاقها من shell Tcl باستخدام أمر typeahead :
typeahead "y\ny"
exec "reload"

أولاً ، سيتم تخزين حرفين "ص" في مخزن الإدخال المؤقت ، مفصولين بخط جديد (\ n) ، ثم سيتم تشغيل أمر إعادة تحميل exec ، الذي سيقرأ أمر إلغاء أو تأكيد إعادة تعيين من مخزن الإدخال المؤقت و (إذا لزم الأمر) حفظ التكوين.

دغدغة لا يدعم الكتابة ، يجب أن نتذكر هذا عند العمل مع المتغيرات:

صورة

يحسب العامل المتداخل [expr {..}] قيمة التعبير المحدد بين قوسين مجعدين ($ a + $ b) ويقوم بإجراء استبدال هذه القيمة بدلاً من الأقواس المربعة.

مثال الإجراء في Tcl:
proc ping_net {x} {
for {set n 1} {$n < $x} {incr n} {
exec "ping 192.168.0.$n"
}
}

عند إدخال قوس مجعد ، لن يغلق المترجم سطر الأوامر حتى تدخل زوجًا من دعامات الإغلاق. يتم تخزين الإجراء في ذاكرة المترجم الشفوي حتى نهاية جلسة المترجم الفوري باستخدام الأمر tclquit. هذا يجعل من الممكن بدء الإجراءات والوصول إلى متغيرات البرامج النصية التي تم إطلاقها مسبقًا. تذكر أن حدوث خطأ في البرنامج النصي يمكن أن يؤدي إلى تكرار حظر جلسة TTY (V) وحظرها! لا تحتوي وحدة التحكم على تسهيلات لإغلاق الطوارئ (مثل Ctrl + Break) ، فالطريقة الوحيدة هي بدء جلسة جديدة clear line "المجمدة" باستخدام الأمر clear line .

الآن دعنا ننتقل إلى حل مشكلة عملية. قبل أن يتم إخراج Cat2950S من 48 منفذًا. السيناريو أدناه

  • يطلب من وحدة التحكم الرقم التسلسلي للتبديل sw_num
  • يحدد اسم المضيف له من التبديل switch_ <sw_num>
  • طلبات وتعيين كلمة مرور لوحدة EXEC ذات الامتيازات
  • تكوين العنوان على واجهة التحكم Fa0 (192.168.0.x) وواجهة Vlan1 (10.0.x.254) وفقًا لرقم التبديل الذي تم إدخاله
  • ينشئ حجز DHCP يستند إلى المنفذ ومجموعة من 48 عنوانًا ، حيث يتم حجز عنوان IP واحد لكل عميل ، حيث تساوي الثمانية الأولى الرقم التسلسلي للمنفذ الذي يتصل به هذا العميل.

 puts "Enter Switch number:" set sw_num [gets stdin] ios_config "hostname switch_$sw_num" puts "Enter password (secret):" set pass [gets stdin] ios_config "enable secret 0 $pass" ios_config "line 0 16" "password 0 $pass" "login" ios_config "int fa0" "ip address 192.168.0.$sw_num 255.255.255.0" "no shut" ios_config "int vlan1" "ip address 10.0.$sw_num.254 255.0.0.0" "no shut" ios_config "ip dhcp use subscriber-id client-id" ios_config "ip dhcp subscriber-id interface-name" #    48       subscriber-id for {set i 1} {$i <= 48} {incr i} {ios_config "int Gi1/0/$i" "ip dhcp server use subscriber-id client-id"} ios_config "ip dhcp pool POOL1" "network 10.0.0.0 255.0.0.0" "reserved-only" "default-router 10.10.0.254" #    48  IP-,   .  for {set i 1} {$i <= 48} {incr i} {ios_config "ip dhcp pool POOL1" "address 10.0.$sw_num.$i client-id Gi1/0/$i ascii"} # 

ملاحظة 1. يوجد خطأ منطقي صغير في هذا البرنامج النصي. محاولة للعثور عليها.

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

السؤال الذي يطرح نفسه: كيف يمكنني كتابة برنامج نصي لذاكرة التبديل باستخدام عنوان IP غير مهيأ يعمل فقط عبر منفذ وحدة التحكم؟ لا تكتب النص بخط اليد! هل من الممكن تكوين واجهة الإدارة يدويًا واستخدام FTP في كل مرة؟ لا ، يمكن أن يكون أسهل. يمكن لـ Cisco IOS نسخ الملفات مباشرة من خلال المنفذ التسلسلي لوحدة التحكم باستخدام بروتوكول Xmodem وحفظها على ومضة. للقيام بذلك ، تحتاج إلى محاكي جهاز طرفي مزود بدعم Xmodem ، على سبيل المثال ، ZOC أو Tera Term (ولكن المعجون المجاني الرائج ، للأسف ، لن يعمل!). يتم إجراء النسخ بواسطة أمر نسخ IOS xmodem: flash: filename ، وبعد ذلك تحتاج إلى إجراء "نقل الملفات" في قائمة المحاكي الطرفي:

صورة

يمكن القيام بذلك أيضًا أثناء وجوده في ROMmon (على سبيل المثال ، إذا قمت "بتقليص" تكوين المفتاح دون كلمة مرور EXEC خاصة). لكن نسخ الملفات مرة أخرى (من ذاكرة الفلاش الخاصة بالتبديل إلى الكمبيوتر الشخصي) غير مدعوم.

لسوء الحظ ، من Tcl ، لا يمكنك فتح جلسة telnet على جهاز توجيه بعيد. أثناء المحاولة
سيتم تجميد جلسة sw(tclsh)#exec "telnet host" في مرحلة إدخال كلمة المرور.

هذا يختتم الرحلة القصيرة إلى إمكانيات لغة Tcl على نظام Cisco IOS ؛ يمكنك دراسة المشكلة بمزيد من التفصيل في مستند Cisco IOS Scripting مع دليل تكوين TCL المتاح على موقع Cisco على الويب.

Source: https://habr.com/ru/post/ar455401/


All Articles