alaim89
Goto Top

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

Content-ID: 239033

Url: https://administrator.de/contentid/239033

Ausgedruckt am: 22.11.2024 um 11:11 Uhr

rubberman
rubberman 23.05.2014 aktualisiert um 18:00:13 Uhr
Goto Top
Hallo alaim89,

mal unabhängig von Sprache und Umsetzung, nach welcher Regel wird denn
1921681780
als
192.168.178.0
und nicht etwa als
192.168.17.80
interpretiert?

Grüße
rubberman
Lochkartenstanzer
Lochkartenstanzer 23.05.2014 aktualisiert um 18:02:53 Uhr
Goto Top
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.

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?
alaim89
alaim89 23.05.2014 um 18:18:31 Uhr
Goto Top
Hi @rubberman,
um auf die Interpretation zu kommen, da habe ich nicht zu ende gedacht face-sad, da habt ihr beide recht @lks.

Bei der sonstigen Überlegung, wisst ihr da, wie ich die Möglichkeit besitze, das die IP-Adresse nacheinander ausgegeben wird?
Ist die Umsetzung überhaupt so möglich, wie ich es oben beschrieben habe ??


beste Grüße

alaim89
Lochkartenstanzer
Lochkartenstanzer 23.05.2014 um 18:24:07 Uhr
Goto Top
Zitat von @alaim89:

Ist die Umsetzung überhaupt so möglich, wie ich es oben beschrieben habe ??


Im Prinzip ja.

lks
colinardo
Lösung colinardo 23.05.2014, aktualisiert am 16.12.2014 um 15:42:44 Uhr
Goto Top
Hallo alaim89,
hier mal ein Gerüst zum Basteln. Denke davon kannst du eventuell was lernen face-wink
(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
Auf das wesentliche Reduziert: Einfache Auflistung von IP-Adressen in einem Bereich kannst du auf der Kommandozeile mit Hilfe von Brace Expansion so machen:
echo 192.168.1.{1..254} | tr " " "\n"
Damit lassen sich schöne Dinge anstellen face-wink

Viel Erfolg
Grüße Uwe
alaim89
alaim89 24.05.2014 um 14:29:44 Uhr
Goto Top
HI @colinardo,

erstmal danke für das Gerüst, das du bereitgestellt hast. Im laufe des Tages werde ich es mal genauer untersuchen.
Die Idee mit der Brace Expansion ist echt der Hammer :D . Das kannte ich noch gar nicht.


beste Grüße


alaim89