Wer hilft mit bei einem Shellscript für die Ermittlung von MACVLAN Informationen?

  • Moinsen an alle BasherInnen oder ShellscripterInnen.

    Ich habe mir die letzten Tage die Finger kaputt getippt, um mir ein Bashscript zusammenzubasteln,

    das mir für meine eingerichteten MACVLAN(s) Informationen bereitstellt.

    Wer mag mir dabei helfen das zu optimieren und mir evtl. auch etwas über den besseren Umgang mit den einzelnen Befehlen erklären,

    falls ich die nicht richtig bzw. ungünstig eingesetzt habe?

    Ich danke allen vorab und total viel, dass ihr euch Zeit dafür genommen habt.


    Vorab einige Informationen.

    Im Einsatz ist bei mir eine Fritz!Box, die WireGuard bereitstellt, und der DHCP ist vorgesehen meine Geräte mit IP-Adressen zu versehen.

    Jetzt hat WireGuard die Eigenschaft, IP-Adressen nach/hinter dem DHCP-Bereich automatisch zu vergeben.

    Was zu einem Problem geführt hätte, wenn ich vorhatte eine MACVLAN hinter dem DHCP-Bereich einzurichten.

    Damit hätte ich keine Kontrolle mehr über die IP-Vergabe und es wäre bestimmt zu Doppelvergaben gekommen.

    Meine Lösung war dann ein neues Netzwerk in der Fritz!Box/Router einzurichten, das richtig groß ist.

    Das wollte ich zwar verhindern, aber dann war alles nur noch lästig, und ein neues Netzwerk hatte dann doch gewonnen.

    Das Script habe ich erst mit dem TextEdit von UGreen programmiert, und bin dann auf VSCode umgestiegen, mit SSH-Remote und jetzt geht es etwas einfacher.

    Script liegt im Freigabe-Ordner docker auf dem Volume1 /volume1/docker und hat den Dateinamen: mcvlan_infos.sh

    Dem musste ich dann noch die Linux-Berechtigung zur Ausführbarkeit geben: sudo chmod +x /volume1/docker/mcvlan_infos.sh

    Das Script führe ich mit diesem Befehl aus: sudo /volume1/docker/mcvlan_infos.sh

    Da sudo eingesetzt wird, wie immer mit Passworteingabe die Ausführung bestätigen.


    Das Script

    Das Script setzt diese Befehle ein:

    • docker network ls --format json
      Gib mir alle Docker-Netzwerke im JSON-Format.
    • docker network ls --filter driver=macvlan --format "{{.Name}}"
      Gib mir eine gefilterte Liste der Netzwerke mit dem Driver=macvlan und nur die Docker-Netzwerk-Namen.
      Diese Namensliste brauche ich, um eine Schleife über die Netzwerke einzusetzen.
    • jq
      Verarbeitung der JSON ausgaben.
      Beispiel aus dem Script: network_names_parts=$(jq -C -r '. | .Name | split(".")' <<< $(docker network ls --format json))
    • echo
      Ich habe viel mit Einfärbungen gearbeitet.
      Beispiel aus dem Script: echo -e "° ${Blue}Networks found: ${NC} ${Yellow}$(grep -o '\]' <<< ${network_names_parts} | wc -l)${NC}"
    • wc
      Konnte mir nicht anders helfen, um an eine Zahl zu kommen.
    • Für den Kontrollfluss if else for
    • ipcalc
      Ich dachte mir, dass Netzwertberechnungen nützlich wären,
      aber der Aufwand, die selber zu programmieren, war mir zu hoch.
      Beispiel aus dem Script: echo -e "      > ${Blue}IPCALC for Subnet of Network${NC} ${Green}${mcvlanitem}${NC}: ${subnet}\n$(ipcalc -c ${subnet})\n"
      Nicht vergessen ipcalc -c , wegen der bunten Farben.

    Das Script ist auf Englisch, wieso nicht.

    Hier der Quellcode im aktuellen Zustand:

    Warnungen

    Ich habe nach bestem gewissen gearbeitet, was das auch zu bedeuten hat.

    Das Script bitte nicht einfach so einsetzen, weil könnte auch was kaputtgehen.

    Bitte lest euch das Script durch, falls ihr es einsetzen wollt.

    Es soll nichts ins Internet hochgeladen werden, und auch soll nichts im System aus dem Script heraus geändert werden.

    Es soll nur Informationen sammeln und ausgeben.

    Bitte die Informationen nicht weitergeben, die geben den Hackern aus Wanne-Eickel und Hamburg genug, um zu schaden. (Wieso Wanne-Eickel überhaupt ...)

    Wo es hapert ...

    Das Script und ich sind jetzt wieder Freunde, aber das war nicht immer so ...

    Ich habe mich noch nicht gut genug in jq eingearbeitet, sowie sind mir die Bash-Script Eigenheiten noch nicht geläufig.

    Ich habe mir überlegt, die einzelnen Umformatierungen und Einfärbungen in Funktionen/Methoden auszulagern.

    Mir ist es einfach nicht gelungen, die Container in ein Array zu überführen, um damit einfacher zu arbeiten.

    Dieser Bereich ist sehr langsam in der Ausführung, weil Wiederholungen?

    Bash
    #!/bin/bash
    
    container_id=$(jq -r '.[].Containers | to_entries | .['$container'] | .key' <<< "${inspect}")
    container_name=$(jq -r '.[].Containers | to_entries | .['$container'] | .value | .Name' <<< "${inspect}")
    container_endpointID=$(jq -r '.[].Containers | to_entries | .['$container'] | .value | .EndpointID' <<< "${inspect}")
    container_macaddress=$(jq -r '.[].Containers | to_entries | .['$container'] | .value | .MacAddress' <<< "${inspect}")
    container_ipv4address=$(jq -r '.[].Containers | to_entries | .['$container'] | .value | .IPv4Address' <<< "${inspect}")
    container_ipv6address=$(jq -r '.[].Containers | to_entries | .['$container'] | .value | .IPv6Address' <<< "${inspect}")

    Etwaige Fehlerbehandlung ist mir nur so nebenbei eingefallen. Sollte wohl eingeplant und verbessert werden ...

    Das mit dem wc ist mir nicht geheuer, aber es geht auch.

    Wie mit dem Script im Forum umgehen?

    Ich habe keine Ahnung, wie mir die HelferInnen Verbesserungen und Vorschläge mitteilen können.

    Einfach hier Antworten oder per Private-Message?

    Nur mal so am Rande, wenn mein PM-Postfach überquillt, dann gebe ich mir nicht die Schuld. Wie immer ...

    Ich schlage vor, es mit direkten Antworten hier im Post.


    Abschlussbemerkungen

    So, bis hier ist erstmal alles gut gegangen, und ihr habt euch wirklich ein Fleißsternchen verdient. :D

    Ich danke für eure Zeit und Geduld und wünsche viel Spaß mit dem Script und bitte fühlt euch nicht gedrängt hier mitzuarbeiten.

    Wenn das Script soweit allgemeingültig ist, möchte ich es im Upload veröffentlichen.

    Dann soll die Datei macvlan_infos.sh heißen. Also die Beta-Version ist mcvlan_infos.sh.

    Die Kommentare sollen nachher alle bereinigt werden. Wer will schon meine Schimpfworte mitlesen?


    Liebe Grüße aus Hamburg und Tüdülüüü :)

    Standard Nerd. "Have You tried to turn it off and on again?", ist mein Lieblingswitz.

    Außerdem habe ich was wichtiges Programmiert, aber vergessen, wo ich das gespeichert habe und was es macht.

    Gut, dass es NAS gibt, oder? Hab euch alle lieb, so ganz pauschal. :love:

    Meine Hardware


    • DH2300 | 4 GB LPDDR4X-RAM | 1x 4 TB Seagate IronWolf - 1x 22 TB Seagate Exos

    Edited once, last by ZuiMelanieForno: Warnungen erweitert um Weitergabe von Informationen im Internet. Code Einfärbung für Bash-Script ausschnitt aktiviert. (November 28, 2025 at 1:24 AM).

  • This threads contains 13 more posts that have been hidden for guests.

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!