[BASH] - 2 Array´s im Skript verknüpfen

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Guten Abend Liebe pi-Gemeinde,

    ich sitze grad an einem kleinen Bash-Skript, welches mir eine kleine Übersicht meiner wichtigen Netzwerkgeräte gibt. Damit das ganze etwas pflegeleichter ist, versuche ich das ganze per Array zu lösen. Gibt es eine Möglichkeit das Array IP mit dem passenden Namen zu verknüpfen? Damit könnte ich eine Info mit dem passenden Device-Namen per Mail/Pushover versenden... Mir würde es schon helfen, wenn ich den Namen angezeigt bekomme, die Benachrichtigung bekomme ich dann wieder hin.

    Vielen Dank für eure Hilfe,

    Grüße micky

  • Bei mir wird das Skript mit folgender Meldung abgebrochen:

    Code
    $ sudo ./test-ping.sh
    
    192.168.178.1 online
    ./test-ping.sh: Zeile 22: 192.168.178.1: Syntaxfehler: Ungültiger arithmetischer Operator. (Fehlerverursachendes Zeichen ist \".168.178.1\").

    Er setzt die komplette IP ins array, statt nur die Position des arrays.

    Einmal editiert, zuletzt von Micky (14. Januar 2018 um 18:06)

  • Sorry, ich hab nicht genau genug hingesehen.

    Das sollte jetzt funktionieren:

  • Perfekt, das war´s... Die Variable für den index.... manchmal sieht man echt den Wald vor Bäumen nicht. Hab gedacht, man kann die position des arrays auch irgendwie direkt ansteuern.

    Vielen Dank für deine schnelle Hilfe.

    LG Micky

  • Hallo Tell,

    das Bash-Skript zum pingen funktioniert. Nun würde ich gern den aktuellen Status der Geräte ermitteln und z.B. in eine kleine Datei schreiben lassen (z.B. in /var/www/ramdisk/status-ip1. Die sollte ja mit

    Code
    ping $i -c 3 -t 5 > /var/www/ramdisk/status-ip1

    klappen.

    Ziel ist es, Zustandsänderungen zu erkennen und nur bei diesen auch eine Nachricht zu versenden. Es wäre also zweitrangig ob Client online/offline ist. Hast du Lust und Zeit mit hierbei zu helfen??

    Danke und Grüße

    Micky

    EDIT:

    Hier mein aktueller Stand:

    Einmal editiert, zuletzt von Micky (14. Januar 2018 um 19:18)

  • Wenn ich mir die temporären Variablen angucke, vermute ich den Fehler in:

    Code
    status_IP[$index]=$(grep -i -c '1 received' ${devicelist_IP[index]})
    Zitat

    Ich wuerde das Script endlos laufen lassen und ein drittes Array fuer den Status nutzen.

    Wie meinst du das? Status nur in Variablen schreiben und nicht in kleine Hilfsdateien?

  • So ein paar Falsche Zeichen und die Anzahl der pings musste geändert werden, hier der aktuelle Stand:


    Die Variablen werde nun alle korrekt gefüllt und Änderungen erkannt, nur die if-Bedingungen unten haben irgendwo noch nen Wurm drin...

  • wow, sehr cool. ja das schaut schon viel eleganter aus und funktioniert wie gewünscht. ganz dicken Dank für deine tolle Unterstützung.

    ich wünsch dir noch nen schönen sonntag

    grüße micky

  • Der Thread ist zwar schon als gelöst markiert ... aber trotzdem möchte ich darauf hinweisen, dass es mit assoziativen Arrays (ja - die gibt es auch in bash) direkt ohne einen ZwischenIndex geht ;)

  • oh wow, nach ein paar Tage und es wird ein Zweizeiler ;) vielen Dank an euch beiden, Skript läuft und tut brav das was es soll. Nun gibt es nur noch Nachrichten bei Änderungen des Online/Offline-Status und nicht mehr alle 5 Minuten wenn mal ein Device offline ist ?? Vielen Dank und nen guten Start in die neue Woche.

    Grüße M.

  • Zu @framp's Beitrag sei evtl. noch erwähnt dass declare mit bash v3 (oder sh) noch nicht funktioniert. Zu unterscheiden gilt auch declare -A von declare -a.

    Siehe dazu auch:

    http://www.gnu.org/software/bash/manual/bashref.html#Arrays

    http://tldp.org/LDP/abs/html/declareref.html

    Daher hab ich zu @Tell's und @framp's Code auch noch einen Optimierungsvorschlag ;)

    Problem: Den Rückgabewert (return / exit code) vom ping Befehl ist nicht gleich zu setzen mit "pingbar". $? ist also nicht allzu zuverlässig.

    Besser wäre:

    Abpropo: Der Parameter -t bedeutet nicht timeout sondern ttl. Du solltest aber schon ein Timeout setzen also zB -W 3


    PS: Die Überschrift des Threads weicht vom Inhalt ab... Mehrere Array's verknüpfen sähe anders aus: MAIN_ARRAY=( SUB_ARRAY_1[@] SUB_ARRAY_2[@] ). Ansonsten setzt man das Index in mehreren Arrays auf den gleichen Wert.

  • Hallo und Guten Abend,

    das o.g. Skript von Tell läuft seit knapp 6 Monaten auf meinem raspberry (stretch). Leider kommt es sporadisch (alle paar Tage) mal zu einem "Offline-Status" obwohl das angepingte Device Online ist... nach 10 Minuten läuft das Skript erneut und findet dann das Device wieder und setzt auch wieder den Online-Status. Testweise habe ich das Skript von meigrafd mit eingebunden, es wird automatisch gestartet wenn sich der Status von einem Device verändert hat. Das Skript von meigrafd erkennt den angepingten Client korrekterweise dann auch als Online, die Erkennung des Status scheint auf den 1. Blick damit zuverlässiger... Leider ist das Skript so kurz und knackig verpackt, dass ich meine Probleme mit dem Verständnis habe. Daher würde ich gern die "Ping-Routine" von meigrafd in das Skript von Tell integrieren, komme hier aber nicht weiter ... Kann mir einer der Skript-Profis kurz unter die Arme greifen? Relevant ist es immer, wenn ein Status sich verändert... wenn er also 10x hintereinander als offline erkannt wird, ist es egal. Ich lasse mich per PushOver immer nur dann benachrichten, wenn sich der Status Online/Offline verändert.

    Grüße M.

    Mein aktueller (nicht funktionierender) Versuch:

    3 Mal editiert, zuletzt von Micky (19. Juli 2018 um 22:42)

  • Ungetestet:

  • Uih, vielen Dank. Ich werde es testen und berichten ;)

    LG und schönen Abend

    M.

    EDIT: Die Zustände online/offline sind vertauscht, welches ich aber schon lösen konnte. Hier die aktuelle Test-Version:

    2 Mal editiert, zuletzt von Micky (21. Juli 2018 um 21:14)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!