Linux Shell Programmierung

  • Hallo Zusammen,


    so.. Ich muss momentan rund 100 Switch überprüfen, daher greife ich per Telnet auf diese Geräte zu.


    Danach gebe ich das Passwort ein und anschliessend auch den Befehl um die Version anzuzeigen


    Nun, um das zu automatisieren dachte ich an ein Shell-Script, welches folgendes macht:


    telnet [IP Switch]
    pause 2
    PASSWORT_EINGABE
    pause 2
    show version


    Jetzt, die Frage ist, wie bringe ich nun das Script dazu, das Passwort einzugeben?
    Optional, wie bringe ich das Scirpt dazu, mir den Output davon nun in eine Datei zu schreiben?

  • Frage1:


    telnet 192.168.0.1 -l admin (kleines L) für Passwort kenn ich nur eine Methode mittels Perl Script, die das Passwort dann sendet. Putty wäre eine alternative mit dessen Command-Line Optionen (google)


    wie in ein file schreiben: mit ">" (ohne ") kannst du den output umleiten, wird dir allerdings relativ wenig bringen, kannst ja das file kaum auf dem switch wohin schreiben. In ein lokales file müsstest du wohl vom Switch wieder rausverbinden (RSH?) und irgendwo den entsprechenden Dienst anbieten...


    |---> it MUST be a spoon! <---|


      

  • also das ganze sollte etwa so aussehen (nur kurz hingeschrieben nicht überprüft):


    Shell-Script
    1. #!/bin/bash
    2. for SWITCH in 10.1.1.1 10.1.1.2 10.1.1.3
    3. do
    4. echo -n "Version of switch ${SWITCH}: " >> switch.log
    5. $( telnet "${SWITCH}" && echo "<password><cr>" && show version ) \
    6. | tail -n1 >> switch.log
    7. done


    das was in $() geschrieben ist, wird zuerst ausgeführt, bevor es an tail weitergegeben wird. tail gibt vom output einfach die letzte zeile aus (login-output willst du ja wohl nicht). die anzahl zeilen kannst du mit der option -n steuern. die pausen musst du imho nicht einbauen, da das kommando nach && erst ausgeführt wird, nachdem das vorhergehende returnt. was etwas knifflig wird, ist das carrage return nach dem passwort. die IPs kannst du auch noch etwas schöner in eine liste schreiben, die dann abgearbeitet wird.


    hier eine gute quelle zur shell-programmierung: http://tldp.org/LDP/abs/html/


    gruss ganto


    "Computer games don't affect kids, I mean if Pacman affected us as kids, we'd all run around in a darkened room munching pills and listening to repetitive music."


    Kristian Wilson

    5 Mal editiert, zuletzt von Ganto ()

  • ups, kleiner überlegungsfehler :(


    telnet returnt natürlich erst, nachdem die ganze kommunikation abgeschlossen ist. habe aber trotzdem eine lösung. werde sie später posten.


    gruss ganto


    "Computer games don't affect kids, I mean if Pacman affected us as kids, we'd all run around in a darkened room munching pills and listening to repetitive music."


    Kristian Wilson

  • ok, habe das ganze nun ausprobiert und es sollte nun folgendermassen funktionieren:


    als erstes musst du schauen, dass du /usr/bin/expect installiert hast. apt-get install expect, yum install expect oder emerge expect


    dann gibt es ein erstes skript connect.sh, dass die telnet kommunikation übernimmt (muss nur noch username und passwort eingesetzt werden).



    das zweite skript switch-versions.sh steuert jetzt die abfrage der verschiedenen switches und das protokollieren.



    nun musst du die skripte noch ausführbar machen chmod +x connect.sh switch-versions.sh und kannst dann das ganze mit ./switch-versions.sh aufrufen. am ende steht das log im versions.log


    da ich nicht weiss, wie die 'show version' ausgabe aussieht, kann ich dir hier das resultat nicht auf nur die versionsnummer zurechtstutzen. im moment wird einfach der ganze telnet output in die datei versions.log protokolliert.


    falls du mir noch ein 'show versions' output hast, kann ich dir das noch anpassen.


    gruss ganto


    "Computer games don't affect kids, I mean if Pacman affected us as kids, we'd all run around in a darkened room munching pills and listening to repetitive music."


    Kristian Wilson

    3 Mal editiert, zuletzt von Ganto ()

  • Hallo Ganto,


    erstmal: danke dir für die Bemühungen. :)
    Es wäre super, wenn jeder Switch eine eigene Datei anlegen würde, mit seinem Output.


    Wie kann man das lösen?

  • schonmal mit


    if $( ./connect.sh "${IP}" >> ${IP}.log 2>&1 )


    statt


    if $( ./connect.sh "${IP}" >> versions.log 2>&1 )


    probiert?


    habe gra dkeine Zeit da rumzuprobieren =)


  • Wunderbar.. :)
    Danke


    #EDIT:


    Habe nun aber das Problem, dass teilweise Password: oder Enter Password nach dem Passwort verlangt.


    Nun habe ich es mit dem versucht:
    expect "Enter password" {send <PW>\r} OR expect expect "Password" {send <PW>\r}


    scheint aber nicht zu klappen..

    Einmal editiert, zuletzt von seng ()

  • schau mal ein bisschen die manpage von expect an. dort steht vielleicht noch was. ich habe das tool vorher auch noch nie gebraucht.


    ganto


    "Computer games don't affect kids, I mean if Pacman affected us as kids, we'd all run around in a darkened room munching pills and listening to repetitive music."


    Kristian Wilson

  • du hast cisco Switches oder?


    Nun da wirst du mit verschiedenen IOS noch schnell mal probleme bekommen...


    Und vorallem musst du noch die Ausgabe auf unendlich schalten, sonst verlang er nach 24 Zeilen einen Any key, bis er die Ausgabe fortsetzt...


    Sonst:
    http://www.kiwisyslog.com/cattools-info.php


    Das kann so ziemlich alles:
    - Auf jedem Switch/Router/Pix irgendwelche Befehle ausführen
    - configs updaten
    - configs sichern
    - Firmware upgraden
    - etc etc etc


    Kostet halt aber ist geil ;)

  • bei vielen IOS kann man doch auch einen SSH server starten. da wären dann natürlich viel komfortablere und flexiblere skripts möglich, da man einen in- oder output direkt über SSH leiten kann.


    ganto


    "Computer games don't affect kids, I mean if Pacman affected us as kids, we'd all run around in a darkened room munching pills and listening to repetitive music."


    Kristian Wilson

    Einmal editiert, zuletzt von Ganto ()

  • Wir sind drna, SSH zu implementieren, darum müssen wir die Versionen der Switche dokumentiert haben, um festzustellen, ob das SSH Upgrade überhaupt möglich ist.. ;)

  • Zitat

    Original von Ganto
    bei vielen IOS kann man doch auch einen SSH server starten. da wären dann natürlich viel komfortablere und flexiblere skripts möglich, da man einen in- oder output direkt über SSH leiten kann.


    Mhh verstehe jetzt den Vorteil nicht wirklich, per SSH musst du dich genauso autentifizieren, etc etc etc...
    ?(

  • erstens kannst du dich direkt mit public-/private-key authentifizieren (da brauchst du nirgends ein passwort im klartext zu speichern) und zweitens kannst du dann so toll sachen machen wie z.b. ssh hostname uname -a >> versions.txt und schon hast du den output lokal bei dir in einem file. oder cat ./new_dns | ssh hostname 'cat - >> /etc/resolv.conf' und schon hast du einen neuen eintrag im resolv.conf file des remote rechners. ist doch geil...


    ganto


    "Computer games don't affect kids, I mean if Pacman affected us as kids, we'd all run around in a darkened room munching pills and listening to repetitive music."


    Kristian Wilson

    Einmal editiert, zuletzt von Ganto ()