Shell: IP-Adresse in Oktett hintereinander ausgeben
Hallo liebe Gemeinde,
ich versuche mich gerade in Bash/Shell scripting einzuarbeiten bzw. meine ersten schritte in der Programmierung. Der ein oder andere kennt das vielleicht, man spielt ein bisschen rum und erstellt sinnlose, aber dennoch lehrreiche Skripte/Programme :D (Ich hoffe das, dass auch Ihr so seht).
Bei mir ist das gerade so, ich möchte ein Bashskript schreiben, das mir die die IP-Adresse in Oktetts ausgibt.
Beispiel:
Als Eingabe gebe ich die Adresse so ein: 1921681780
Genau diese möchte ich in der Ausgabe als Oktett Darstellung haben: 192.168.178.0
Desweiteren möchte ich einen Bereich mit einbauen, wo ich genau sagen kann, gebe die Adresse bis 22 aus.
Beispiel:
zaehler -> 22, 192.168.178.1 192.168.178.2 usw. bis 192.168.178.23.
Vom Konstrukt her, habe ich mir gedacht, das auf jeden Fall if Entscheidungen eingebaut werden müssen, für die Überprüfung ob es sich um zahlen oder Buchstaben handelt die mit angegeben worden sind. Weiterhin soll die Fallunterscheidung nur akzeptieren wenn es sich tatsächlich um zahlen handelt.
Bei dem hochzählen habe ich an eine for-schleife gedacht. Diese soll auch nur ausgeführt werden, wenn tatsächlich in der Fallunterscheidung, es sich nur um zahlen handelt.
Meine Schwierigkeit die ich gerade habe, ist das ich nicht genau weiß wie ich das mit den Oktetten hinbekomme wie ober erwähnt.
Meine Überlegung dazu ist, ob man die Möglichkeit hat, wenn ich den Zahlenbereich eingebe, ob diese temporär gespeichert werden kann (sollte gehen) diese dann aber bei einem Aufruf ( einer Funktion ?, String-Manipulation (sed,awk,?) ) einsetzen kann und die dann als Oktett ausgegeben wird.
Ich bin noch am Anfang der Programmierung, deswegen schont trotzdem nicht mit Kritik beim falschen Ausdruck oder nicht ganz so galanter Überlegungen.
beste Grüße
alaim89
ich versuche mich gerade in Bash/Shell scripting einzuarbeiten bzw. meine ersten schritte in der Programmierung. Der ein oder andere kennt das vielleicht, man spielt ein bisschen rum und erstellt sinnlose, aber dennoch lehrreiche Skripte/Programme :D (Ich hoffe das, dass auch Ihr so seht).
Bei mir ist das gerade so, ich möchte ein Bashskript schreiben, das mir die die IP-Adresse in Oktetts ausgibt.
Beispiel:
Als Eingabe gebe ich die Adresse so ein: 1921681780
Genau diese möchte ich in der Ausgabe als Oktett Darstellung haben: 192.168.178.0
Desweiteren möchte ich einen Bereich mit einbauen, wo ich genau sagen kann, gebe die Adresse bis 22 aus.
Beispiel:
zaehler -> 22, 192.168.178.1 192.168.178.2 usw. bis 192.168.178.23.
Vom Konstrukt her, habe ich mir gedacht, das auf jeden Fall if Entscheidungen eingebaut werden müssen, für die Überprüfung ob es sich um zahlen oder Buchstaben handelt die mit angegeben worden sind. Weiterhin soll die Fallunterscheidung nur akzeptieren wenn es sich tatsächlich um zahlen handelt.
Bei dem hochzählen habe ich an eine for-schleife gedacht. Diese soll auch nur ausgeführt werden, wenn tatsächlich in der Fallunterscheidung, es sich nur um zahlen handelt.
Meine Schwierigkeit die ich gerade habe, ist das ich nicht genau weiß wie ich das mit den Oktetten hinbekomme wie ober erwähnt.
Meine Überlegung dazu ist, ob man die Möglichkeit hat, wenn ich den Zahlenbereich eingebe, ob diese temporär gespeichert werden kann (sollte gehen) diese dann aber bei einem Aufruf ( einer Funktion ?, String-Manipulation (sed,awk,?) ) einsetzen kann und die dann als Oktett ausgegeben wird.
Ich bin noch am Anfang der Programmierung, deswegen schont trotzdem nicht mit Kritik beim falschen Ausdruck oder nicht ganz so galanter Überlegungen.
beste Grüße
alaim89
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 239033
Url: https://administrator.de/contentid/239033
Ausgedruckt am: 22.11.2024 um 11:11 Uhr
6 Kommentare
Neuester Kommentar
Zitat von @alaim89:
Ich bin noch am Anfang der Programmierung, deswegen schont trotzdem nicht mit Kritik beim falschen Ausdruck oder nicht ganz so
galanter Überlegungen.
Ich bin noch am Anfang der Programmierung, deswegen schont trotzdem nicht mit Kritik beim falschen Ausdruck oder nicht ganz so
galanter Überlegungen.
Warum das komische Einagabeformat? wenn man eine IP-Adresse als dezimalzahl eingibt sollte man die auch als dezimalzahl zwischen 0 und 4 Mio. (2^32-1) interpretieren udn dementsprechend behandeln. oder der benutzer soll die Punkte mittippen, so daß man daraus ersehen kann, ob die nun als dezimalzahl oder als mehrere bytes interpretiert werden soll.
lks
PS: Deine eingabemethode kann zu mehrdeutigkeiten führen: Welche IP-Adresse bezeichenet 1111111111?
Hallo alaim89,
hier mal ein Gerüst zum Basteln. Denke davon kannst du eventuell was lernen
(Script erhebt keinen Anspruch auf Vollständigkeit)
Auf das wesentliche Reduziert: Einfache Auflistung von IP-Adressen in einem Bereich kannst du auf der Kommandozeile mit Hilfe von Brace Expansion so machen:
Damit lassen sich schöne Dinge anstellen
Viel Erfolg
Grüße Uwe
hier mal ein Gerüst zum Basteln. Denke davon kannst du eventuell was lernen
(Script erhebt keinen Anspruch auf Vollständigkeit)
#!/bin/bash
# Regex für die IP-Adresse / Bereich 0.0.0.0 - 255.255.255.255
ip_regex="^(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])$"
# Regex für die Bereichseingabe / Bereichsformat [0-255]-[0-255]
bereich_regex="^(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])-(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])$"
echo "Bitte geben sie eine IP-Adresse ein:"
# Eingabe in Variable speichern
read ip
# IP prüfen
if [[ $ip =~ $ip_regex ]]; then
echo "Bitte geben sie einen Bereich ein der ausgeben werden soll (im Format: 1-22)"
# Host-Adressbereich in Variable speichern
read bereich
# Bereichseingabe prüfen
if [[ $bereich =~ $bereich_regex ]];then
# IP-Adresse auf Netz reduzieren (im Beispiel Maske 255.255.255.0)
netz=${ip%.*}
# von bis aufsplitten
from=${bereich%-*}
to=${bereich#*-}
# prüfen ob Endbereich kleiner als Startbereich ist
if [[ $to -lt $from ]]; then echo "Endbereich ist kleiner als Zielbereich!"; exit; fi
# IP-Adressen sequentiell auflisten
eval echo $netz.{$from..$to} | tr " " "\n"
else # Eingabeformat des Bereichs falsch
echo "Format des Bereichs falsch!"
exit
fi
else # Eingabeformat der IP falsch
echo "IP hat nicht das korrekte Format!"
exit
fi
echo 192.168.1.{1..254} | tr " " "\n"
Viel Erfolg
Grüße Uwe