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).

  • Ich nutze kein MACVLAN und hab auch kein UGreen NAS, aber ich verstehe dein Problem mit DHCP und MACVLAN nicht. Du schreibst ja

    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.

    Das ist doch nur ein Problem, wenn du dein MACVLAN im DHCP Bereich oder dahinter definierst. Soweit ich weiß, hängt die Fritzbox die VPN IPs direkt hinter den DHCP. Wenn du dein MACVLAN vor den DHCP Bereich legst, dann hast du auch keine Konflikte. Und du kannst den DHCP Bereich ja auch weiter nach hinten verschieben. Dann hast du genug freie IPs oder du wählst ein anderes Netz als das 192.168.

  • Der MacVlan-Bereich muss aus DHCP ausgenommen werden. Die IP-Adressen aus dem MacVlan-Bereich werden den Containern statisch zugewiesen.
    VG Willi

  • Moinsen.

    Ich habe es missverständlich formuliert, gemeint war, dass meine angestrebte MACVLAN-Größe zu klein war für meine Konfiguration.

    Das habe ich mit einem /20er-Netz auf enorme 4096 IPs neu aufgespannt.

    Das MACVLAN-Netz dann auf /23er und weit hinter dem DHCP und hoffentlich genug IPs für VPN und so ...

    Aber danke nochmals ... Hab euch sowas von lieb.

    Habt ihr evtl. Gelegenheit gehabt, euch das Script anzusehen?

    Im Moment versuche ich es so weit zu erweitern, dass mir die Routen/Links als Bach-Kommandos ausgegeben werden.

    Ich will noch herausfinden, wie die wieder rückstandslos entfernt werden.

    Ich schätze die Befehle einfach in der umgekehrten Reihenfolge, mit remove und so weiter ….

    Dann möchte ich noch die Möglichkeit haben, nach Diensten zu schauen, wegen der Neustart-Persistenz der Routen/Links.


    Tüdülüü und blumige Grüße aus HaHa.

    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

  • Da ich kein MACVLAN nutze, hab ich es mir nicht weiter angeguckt. Aber ich wüsste auch nicht wirklich wofür ich das brauche, weil ich alle meine vergebenen IPs dokumentiere. Dies würde ich auch bei MACVLAN machen. So wüsste ich eh welche IPs vergeben sind. Und ich würde halt auch den IP Bereich für MACVLAN VOR dem DHCP Bereich setzen. Dann kann es auch keine Konflikte mit VPN geben. So hat man direkt weniger Fehlerquellen.

    BTW: Mit folgendem Befehl bekommst du auch alle IPs und MAC Adressen von allen Containern.

    Code
    docker inspect $(docker ps -q ) \
    --format='{{ printf "%-50s" .Name}} {{range .NetworkSettings.Networks}}{{.IPAddress}} - {{.MacAddress }} {{end}}'

    Kann man natürlich um jedes Feld was dich interessiert erweitern. Da sparst du dir auch das jq.

  • Moinsen @GreenHorn86

    Danke für den Tipp, werde den gleich mal ausprobieren.

    Ich habe mir davor zwar kein MACVLAN angelegt, aber halt mir die Möglichkeit gelassen.

    1024 IPs vor dem DHCP und dem VPN Bereich, der auch 1024 lang ist und dann habe ich noch zwei 1024er dahinter frei,

    wobei einer schon jetzt vergeben ist.

    Es sollen evtl. Entwickler- bzw. Docker-Container erzeugbar werden, um evtl. parallele Testumgebungen etc. zu ermöglichen.

    Ich habe vorher mit NGINX-Proxy-Manager und mittels IP/Portnummer gearbeitet, und dachte mir ich gebe dem Tutorial mal eine Chance und verwende MACVLAN.

    Aber erstmal Mittach ... :)

    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

  • Meine Hardware


    • DXP2800 | 8GB | 2 x 4TB WD Red NAS | 2 x 250GB WD Red NAS NVMe SSD

  • Moinsen lieber nebelwaende.de oder eher eine liebe?

    Das ist ja richtig gut. Jetzt habe ich einmal ein gutes Beispiel für die jq-Sache.

    Mir hätte die Analogie zu den LINQ-Queries in .NET auffallen sollen.

    Mal eine Frage, hast du die Kommentare und die Refaktorierung selbst gemacht?

    Wenn ja, kann ich bei dir in die Coding-Schule und von vorne anfangen?

    Wenn nein, welches Tool hast du denn eingesetzt?

    Wie war denn die Ausgabe, zu lang, zu kurz oder gar zu trocken oder zu nass?

    Ich kann dir nur vielmals danken, mehr hab ich nicht, habe alle in ein neues NAS investiert. ;)

    Ich freue mich gerade wie Bolle und sein Schmitz und die Hamsterkatze. Juhuuu.

    Grüße dein dich lie ... uups war ja öffentlich der Post. Hat ja keiner gehört. Hi. Hi.

    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

  • Guten Morgen, es freut mich sehr, das das Script funktioniert und macht was es soll und auch ein wenig schneller geworden ist. Du kannst Dir Docuwriter.ai mal ansehen. Es baut u.a. Kommentare in Deine Shellscripte ein. Poste Doch mal nen Output anonymisiert hier. Mich interessiert das Ergebnis sehr. Ich habe bei mir leider keinen MacVlans konfiguriert gehabt. Da war der Wert auf 0. Liebe Grüße aus Bochum

    Meine Hardware


    • DXP2800 | 8GB | 2 x 4TB WD Red NAS | 2 x 250GB WD Red NAS NVMe SSD

  • Moinsen. Erstmal Kaffee ... oder Tee.

    OK. Werde einmal heute eine anonymisierte Ausgabe machen und hier hereinstellen.

    Bin aber noch nicht zum Testen deiner Optimierungen gekommen, nach dem Kaffee, aber dann sofort.

    Habe kurz einmal auf DocuWriter.ai geguckt, aber einloggen war mir etwas zu früh.

    Bis später ... muss mal ganz schnell den Output erhöhen und verschleiern.

    Liebe Grüße nach Bochum.

    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

  • Moinsen.

    Hier einmal eine Ausgabe aus dem Script.

    Es kann Fehler enthalten, es soll eher die Farben und Struktur aufzeigen.

    Im hinteren Teil ist nur Blödsinn, an dem ich gerade arbeite.

    Ich hoffe, die Farben bleiben erhalten.

    So, jetzt muss ich erstmal die Vorschläge von nebelwaende.de einbauen.

    Bis später ...


    Ich nochmal, das mit den Farben im vorherigen Post, ging schief.

    Ich lade jetzt Screenshots hoch.

    This image is exclusive to our members!
    Please log in or register for free to view graphics and attachments.


    This image is exclusive to our members!
    Please log in or register for free to view graphics and attachments.


    This image is exclusive to our members!
    Please log in or register for free to view graphics and attachments.


    This image is exclusive to our members!
    Please log in or register for free to view graphics and attachments.


    Ich hoffe, es ist genehm ...

    Grüße aus HaHa.

    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: Ein Beitrag von ZuiMelanieForno mit diesem Beitrag zusammengefügt. (November 29, 2025 at 9:30 AM).

  • Mahlzeit.

    Da bin ich mal kurz am Scripten und dann sowas ...

    Hier die nächste Version mit eingebauten Verbesserungen von nebelwaende.de.

    nebelwaende.de das Script ist ja jetzt sowas von schnell und viel besser zu behandeln.

    Einige Umstellungen und kleine Farbtupfer hier und da ...

    mapfile ist mir bei meinen Versuchen nicht gelungen, aber jetzt hab ich ja ein gutes Beispiel.

    Es sind noch Kleinigkeiten, die nicht laufen.

    Eine Sache, die mir aufgefallen ist, dass ich beim Einrichten von weiteren MACVLANs etwas schummeln musste.

    Mir ging es erst einmal um die Erkennung von mehreren MACVLANs.

    Dabei habe ich sehr oft die neu anlegen müssen und habe dann vergessen mir Ausschluss IPs anzulegen.

    Was dann den Wert von .[0].IPAM.Config[0].AuxiliaryAddresses["device0"] nicht korrekt ausliest

    und dafür dann den Wert für die NIC .[0].Options.parent einsetzt.

    Egal erstmal so weit funktioniert es mit einem MACVLAN.


    Sodele, werde erstmal Pause machen. Kaffee.

    Viel Spaß beim Ausprobieren.

    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

  • Moinsen. Ich mal wieder ...

    Ich habe um Weihnachten herum das Skript refaktoriert und es überwiegend auf Funktionen umgebaut.

    Zwei weitere Features wollte ich noch einprogrammieren, aber ich habe gerade keinen Draht gerade zum Thema Bashing zu Zeit.

    Features, die Ich vielleicht gerne hätte:

    1. Bei einem MACVLAN die nächsten freien IP-Adressen als Copy Paste Text für Docker-Compose-Dateien bereitstellen.

    2. Ausgabe und Erklärung von Systemdienst-Erstellung für MACVLAN.

    Quote

    Wie im

    Willi
    January 19, 2025 at 8:46 PM

    erklärt, ist eine Erstellung einer Datei, die dann in einen Ordner kopiert wird und diese dann als System-Dienst eingerichtet wird.

    Cool wäre es wenn das Skrip ermittelt, ob es schon einen vorhanden Dienst gibt.

    Dann soll die TUT/Anleitung in Skript für diesen Bereich.

    --- Dienst anlegen in Debian/System-D zwecks persistenz von MACVLAN und Netzwerk-Brücke MACVLAN-HOST ---


    Das umgeschriebene Skript:

    Es wäre schön, wenn jemand das hier mal ausprobieren könnte.

    Wer das macht, bekommt von mir auch ein Herzchen. Versprochen ... :D


    So erstmal Kaffee ...

    Tüdülüü ihr lieben und viel Spaß beim Testen. Danke für eure Zeit.

    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

Participate now!

Join our community with over 10,000 members!

Register yourself now for free to get full access to all content, graphics, downloads and other exclusive features!