Stellen Sie sich vor, Sie müssen Dutzende von Cisco Access Switches des gleichen Typs von Grund auf neu bereitstellen. Eine typische Konfiguration umfasst einen Hostnamen und eine Domäne, ein Standardgateway, Kennwörter, eine Benutzerliste, IP-Adressen für SVIs, VLAN-Nummern, Einstellungen für Uplink-Amtsleitungen usw. Es ist sehr lang und unproduktiv, es jedes Mal mit den Händen zu betreten. Natürlich können Sie eine typische Konfiguration erstellen und über (T) FTP hochladen, aber erstens ist mindestens eine minimale Konfiguration über die Konsole erforderlich, und zweitens müssen die veränderlichen Konfigurationsparameter noch geändert werden. Um diese (und viele andere) Aufgaben zu lösen, enthält Cisco IOS ein leistungsstarkes Automatisierungstool - einen integrierten Tcl-Interpreter (Cisco IOS-Scripting mit Tcl).
Was ist Tcl
Tcl (lesbares "Tickle", manchmal "Flowed") ist eine interpretierte Programmiersprache, die Ende der 80er Jahre zum Einbetten in Konsolenanwendungen entwickelt wurde. Das Funktionsspektrum des modernen Tcl ist sehr breit: Hier werden OOP und erweiterte Regexp-Tools, dynamische Arrays usw. unterstützt.
Die Unterstützung für diese Sprache wurde erstmals auf der Cisco IOS 12.2 (3) T-Plattform angezeigt (in einigen Quellen wird sie unter 12.3 (2) angegeben, ich habe jedoch keine Bestätigung dafür gefunden) und bietet derzeit mehrere Optionen:
- Tcl-Interpreter mit Befehlszeilenschnittstelle. Es ist in verschiedene Versionen der Cisco IOS-Plattform integriert, einschließlich IOS XE und XR, und ist für eine Vielzahl von Geräten verfügbar. Ermöglicht das Ausführen von Tcl-Befehlen, das Ausführen vorgefertigter Skripte als Dateien usw. Geräte, die nicht iOS als Betriebssystem verwenden, sondern beispielsweise Cat OS oder ASA (in der gleichnamigen Firewall), enthalten keinen Befehlszeileninterpreter.
- T.N. „Integrierter Event Manager“ oder EEM - ein Event-Tracking-System, mit dem Sie automatisch in Echtzeit darauf reagieren können. Überwachen Sie beispielsweise einen Remote-Host mit einer E-Mail-Benachrichtigung. EEM-Skripte (Applets) werden in Tcl geschrieben, EEM selbst bietet jedoch keine separate Tcl-Befehlszeile. Ein Anwendungsbeispiel finden Sie hier . EEM ist auf Nexus (NX OS) - und ASA-Plattformen ab Version 9.2 (1) und höher verfügbar.
- Sprachmenüsysteme IVR (Interactive Voice Responce).
Wie kann festgestellt werden, ob ein Befehlsinterpreter vorhanden ist, der das Gerätemodell oder die Version von iOS kennt?
Hierfür gibt es einen
Cisco Feature Navigator :

Mit dem Menüpunkt
Research Features können Sie eine bestimmte IOS-Version für eine bestimmte IOS Train Release oder eine bestimmte Hardwareplattform auswählen. Über den Menüpunkt
Research Software können Sie alle Versionen von iOS mit Tcl-Unterstützung für eine bestimmte Hardware finden. Wir klicken, filtern das Feld Filtern nach nach dem Namen (Funktionsname) "Cisco IOS-Scripting mit Tcl" (oder einfach "Tcl"), fügen den Funktionsnamen zur Liste hinzu, wählen Zugversion aus und erhalten eine Liste aller IOS-Versionen, die diese Funktion enthalten:

Leider ist die CFN-Datenbank unvollständig und zeigt manchmal nicht alle Informationen an. Für die CAT2960S-Plattform zeigte der Navigator das Vorhandensein von Tcl in der Version IOS 15.2E1 und nicht in der Version 15.2E9, obwohl der Tcl-Interpreter tatsächlich sowohl dort als auch dort ist.
Was kann in Cisco IOS mit Tcl getan werden? Ziemlich viel: Durchsuchen und Ändern der Konfiguration, Erstellen interaktiver Skripte, Bearbeiten von MIB-Objekten, TCP- und UDP-Sockets und sogar ...
Schreiben einer ganzen Web-Shell!Im Allgemeinen enthält ein Tcl-Programm eine Folge von Befehlen, die durch einen Zeilenumbruch oder ein Semikolon getrennt sind. Nicht erklärendes Beispiel:
puts "Hello, world!"; puts "My first Tcl IOS script!"
Einige Betreiber:
#
Kommentar am Ende der Zeile
set a 1
Zuordnung a = 1
$a
Ermittelt den Wert einer Variablen
{ }
Blockanweisung - Definiert den Hauptteil der Schleife oder Bedingung
Substitutionsoperator
[ ]
- Bei Ausführung wird anstelle von eckigen Klammern der berechnete Wert des darin enthaltenen Ausdrucks ersetzt
== <= <>
Vergleichsoperatoren
puts "text"
zeigt die Zeichenfolge "text" in stdout an (dh zur Konsole)
puts $a
ähnlich für den Wert von a
gets stdin
liest Werte von der Konsole
set a [gets stdin]
gib einen Wert von der Konsole ein und weise seine Variable a zu
for {set i 1} {$i < 10} {inrc i} {....}
für Schleife
proc {argument, ....} {body}
procedure
Eine vollständigere Liste finden Sie unter
progopedia.ru/language/tclDer Tcl-Interpreter wird mit dem Befehl tclsh aus dem privilegierten EXEC-Modus gestartet:
sw#Tclsh sw(tcl)#
Führen Sie das erste Skript aus:

Das Beenden des Interpreters ist der Befehl
tclquit
oder wird einfach beendet. Tcl unterscheidet zwischen Groß- und Kleinschreibung, daher gibt
Puts "Hello, world"
einen Fehler aus, aber das Shell-Register der IOS-Shell ist nicht wichtig. Alle Eingabebefehle werden zuerst vom Tcl-Interpreter verarbeitet, wenn der Eingabebefehl mit usw. ausgeführt werden kann. Tcl wird ausgeführt und das Ergebnis wird an das TTY-Gerät ausgegeben. Wenn der Befehl vom Interpreter nicht ausgeführt werden kann, wird er an den IOS-Befehlsparser übergeben. Somit kann ein Skript Tcl-Anweisungen und IOS-Befehle kombinieren. Die IOS-Umgebung enthält keinen vollwertigen Texteditor, daher müssen vordefinierte Skripte mit externen Mitteln erstellt und erst dann in Flash oder in den Speicher kopiert werden. Es unterstützt auch die Vorkompilierung des Skripts in Bytecode mit anschließendem Start. Der Start der Skriptdatei wird vom Befehl ausgeführt
tclsh flash:filename
Es sind mehrere Tcl-Interpretersitzungen aus verschiedenen TTY-Sitzungen zulässig.
Interne Befehle des Tcl-Interpreters:
exec - Führt den angegebenen Befehl aus dem privilegierten EXEC-Satz der IOS-CLI aus.
sw(tcl)#exec "show int fa0"
gibt
sw(tcl)#exec "show int fa0"
:
ios-config - führt einen Befehl aus dem globalen Konfigurationsmodus aus. Dahinter werden in separaten Paar-Anführungszeichen alle nachfolgenden Unterkonfigurationsbefehle angezeigt. Zum Beispiel:
sw(tcl)#ios_config "int fa0" "ip address 192.168.0.1 255.255.255.0" "no shut"
entspricht einer Reihe von iOS-Befehlen:
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
Der Tcl-Interpreter verhindert, dass Exec-Prozesse direkt mit der Konsole interagieren. Daher erfolgt die Übertragung von Daten an Ausführungsprozesse, die von der Tcl-Shell gestartet werden, mit dem
Befehl typeahead :
typeahead "y\ny"
exec "reload"
Zuerst werden zwei "y" -Zeichen im Eingabepuffer gespeichert, getrennt durch einen Zeilenumbruch (\ n). Anschließend wird der Befehl zum erneuten Laden von exec gestartet, der den Befehl zum Abbrechen oder Bestätigen des Zurücksetzens aus dem Eingabepuffer liest und (falls erforderlich) die Konfiguration speichert.
Das Tickle unterstützt keine Eingabe. Dies muss beim Arbeiten mit Variablen beachtet werden:

Der verschachtelte Operator
[expr {..}]
berechnet den Wert des Ausdrucks in geschweiften Klammern ($ a + $ b) und ersetzt diesen Wert anstelle von eckigen Klammern.
Beispielverfahren in Tcl:
proc ping_net {x} {
for {set n 1} {$n < $x} {incr n} {
exec "ping 192.168.0.$n"
}
}
Wenn Sie eine geschweifte Klammer eingeben, schließt der Interpreter die Befehlszeile erst, wenn Sie ein Paar schließender Klammern eingeben. Die Prozedur wird bis zum Ende der Interpretersitzung mit dem Befehl tclquit im Interpreterspeicher gespeichert. Dies ermöglicht das Starten von Prozeduren und den Zugriff auf Variablen zuvor gestarteter Skripte. Denken Sie daran, dass ein Fehler im Skript dazu führen kann, dass Ihre (V) TTY-Sitzung geloopt und blockiert wird! Die Konsole verfügt nicht über Notabschaltfunktionen (z. B. Strg + Unterbrechung). Die einzige Möglichkeit besteht darin, eine neue Sitzung zu starten und
clear line
"eingefrorene" Sitzung mit dem Befehl "
clear line
" zu
clear line
.
Fahren wir nun mit der Lösung eines praktischen Problems fort. Vor uns liegt der 48-Port Cat2950S. Das Skript unten
- fordert von der Konsole die Seriennummer des Switches sw_num an
- Legt den Hostnamen für die Form switch_ <sw_num> fest
- fordert ein Kennwort für eine privilegierte EXEC-Konsole an und legt dieses fest
- Konfiguriert die Adresse auf der Fa0-Steuerschnittstelle (192.168.0.x) und der Vlan1-Schnittstelle (10.0.x.254) gemäß der eingegebenen Schalternummer
- Erstellt eine portbasierte DHCP-Reservierung und einen Pool von 48 Adressen, in denen für jeden Client eine IP-Adresse reserviert ist, deren unteres Oktett der Seriennummer des Ports entspricht, über den dieser Client verbunden ist.
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"} #
Hinweis 1. In diesem Skript liegt ein kleiner logischer Fehler vor. Versuche sie zu finden.
Hinweis 2. Einige Texteditoren möchten ein nicht druckbares EoF-Zeichen am Ende der Datei einfügen. Sie können es in der IOS-Konsole anzeigen, indem Sie den Inhalt der Datei mit cat oder mehr auflisten. Nachdem der Tcl-Interpreter auf EoF gestoßen ist, gibt er einen Fehler aus und ignoriert die gesamte Zeile. Daher habe ich am Ende des Skripts ein Escape-Zeichen hinterlassen.
Es stellt sich die Frage: Wie kann ich ein Skript mit einer nicht konfigurierten IP in den Speicher eines Switches schreiben, das nur über den Konsolenport funktioniert? Geben Sie das Skript nicht von Hand ein! Ist es möglich, die Verwaltungsschnittstelle manuell zu konfigurieren und jedes Mal FTP zu verwenden? Nein, es kann einfacher sein. Cisco IOS kann Dateien mithilfe des Xmodem-Protokolls direkt über die serielle Schnittstelle der Konsole kopieren und auf einem Flash speichern. Dazu benötigen Sie einen Terminalemulator mit Xmodem-Unterstützung, z. B. ZOC oder Tera Term (aber der beliebte kostenlose Putty funktioniert leider nicht!). Das Kopieren wird mit dem Befehl IOS
copy xmodem: flash: filename ausgeführt. Anschließend müssen Sie die Dateiübertragung im Terminalemulator-Menü ausführen:

Dies kann auch in ROMmon erfolgen (z. B. wenn Sie die Switch-Konfiguration ohne ein privilegiertes EXEC-Passwort "abreißen"). Das Zurückkopieren von Dateien (vom Flash-Speicher des Switch auf den PC) wird jedoch nicht unterstützt.
Leider können Sie von Tcl aus keine Telnet-Sitzung für einen Remote-Router öffnen. Beim Versuch
sw(tclsh)#exec "telnet host"
gerade bei der Passworteingabe ein.
Damit ist die kurze Einführung in die Funktionen der Tcl-Sprache auf der Cisco IOS-Plattform abgeschlossen. Weitere Informationen zum Problem finden Sie im Dokument Cisco IOS Scripting mit TCL-Konfigurationshandbuch auf der Cisco-Website.