# Mit AWK IP-Adresse auslesen



## dux (24. März 2010)

Hallo Leute!!
ich bin Neuregistrierter und versuche mich hier gerade zu Recht zu finden. Meine Frage ist: Wie kann man anhand eines AWK-Skripts die IP von meiner WLAN-Karte aus einer ifconfig Ausgabe auslesen? Ich habe versucht die Ausgabe in einer Datei zu speichern (jedes mal in der gleichen). ich bin soweit gekommen, dass ich alle IPs aus allen vorhandenen Interfaces lesen kann. Jetzt ist meine Frage, wie kann ich ausschließlich die IP von der WLAN-Karte lesen? Danke im Voraus.

```
#!/usr/bin/awk -f
#Ip von Wlan0 auslesen
BEGIN{
	system("ifconfig >IPDaten")
}

{}

END{
	while(getline<"IPDaten")
	{
		if($1=="inet")
		{
			print substr($2,9,20);
		}
	}
}
```


----------



## deepthroat (25. März 2010)

Hi.

Du kannst dem ifconfig Programm das gewünschte Interface angeben, dann wird nur dieses eine Interface aufgelistet.

Aber eine Datei anzulegen würde ich auf jeden Fall vermeiden.

```
BEGIN { 
  while ("ifconfig wlan0" | getline) {
    if (match($0, "(^|[ \t])inet addr:[0-9.]*")) {
      split(substr($0, RSTART, RLENGTH), a, ":");
      print a[2];
    }
  }
}
```
Nebenbei, warum verwendest du denn AWK und kein Shellskript?

```
ifconfig wlan0 | sed -ne 's/.*\(^\|[ \t]\)inet addr:\([0-9.]*\).*/\2/p'
```
Gruß


----------



## vfl_freak (25. März 2010)

deepthroat hat gesagt.:


> Aber eine Datei anzulegen würde ich auf jeden Fall vermeiden.



Moin deepthroat,

da würde mich mal Dein Meinung interessieren, warum 
Ich lege eine vergleichbare Datei aus einer Java-Applikation heraus an, um damit die MAC-Adresse des PC zu bestimmen - und das klappt sehr gut!

Danke und Gruß
Klaus


----------



## deepthroat (25. März 2010)

vfl_freak hat gesagt.:


> Moin deepthroat,
> 
> da würde mich mal Dein Meinung interessieren, warum
> Ich lege eine vergleichbare Datei aus einer Java-Applikation heraus an, um damit die MAC-Adresse des PC zu bestimmen - und das klappt sehr gut!


Man kann sich damit mehr Probleme einhandeln als einem lieb ist.


Sicherheitsaspekt. Temporäre Dateien sind Angriffsziele für Attacken.
Systemeinstellungen. Ist das temporäre Verzeichis überhaupt richtig konfiguriert? Konnte die Datei überhaupt angelegt werden?
Parallele Ausführung. Was ist wenn das Programm mehrfach gleichzeitig gestartet wird. Wird in die gleiche Datei geschrieben oder die Datei überschrieben oder schlägt der Zugriff auf die Datei fehl weil sie noch von dem anderen Programm geöffnet ist?

Siehe z.B. http://www.codeproject.com/KB/web-security/TemporaryFileSecurity.aspx auf was man bei temp. Dateien achten sollte.



> Tip 1. Avoid temporary files altogether



Gruß


----------



## vfl_freak (25. März 2010)

deepthroat hat gesagt.:


> Man kann sich damit mehr Probleme einhandeln als einem lieb ist.
> 
> 
> Sicherheitsaspekt. Temporäre Dateien sind Angriffsziele für Attacken.
> ...



Moin deepthroat,

ah, ok ... und danke für die schnelle Antwort !

(a)  Einverstanden, aus dem Grund wird die Datei aber auch direkt nach dem Auslesen der MAC-Adresse wieder gelöscht 
(b)  Ok, ich speichere sie allerdings auch nicht im temporären Verzeichnis, sondern in dem Verzeichnis, aus dem die Anwendung heraus 
      gestartet wird. Würde es nicht existieren, dann hätte ich gar nicht starten können ... 
      Kann ich anschließend die MAC-Adresse nicht auslesen, da die Datei nicht ex., wird der Start abgebrochen!
(c)  Unsere Applikation ist so gebaut, dass immer nur eine einzige Programminstanz pro Rechner existieren kann und darf. Alle weiteren 
      Startversuche werden gnadenlos unterbunden! 

Es ist ja leider unter Java wegen der Plattform-Unabhängigkeit leider etwas schwierig, an besagte MAC-Adresse auf anderem Weg zu kommen. Da unsere Anwendung ohnehin nur unter WIN-OS betrieben, wäre der alternative Weg wohl nur über das JNI zu gehen ... und der Aufwand dafür ist mir/uns einfach zu groß 

Gruß
Klaus


----------



## deepthroat (25. März 2010)

vfl_freak hat gesagt.:


> (a)  Einverstanden, aus dem Grund wird die Datei aber auch direkt nach dem Auslesen der MAC-Adresse wieder gelöscht


Das spielt keine Rolle. Eine Attacke kann immer zwischendurch evtl. die Datei verändern / austauschen (hängt natürlich von den Zugriffsrechten und Sharing Flags ab - Tip 5). Die Datei sollte einen zufälligen Namen haben (Tip 4).


vfl_freak hat gesagt.:


> (b)  Ok, ich speichere sie allerdings auch nicht im temporären Verzeichnis, sondern in dem Verzeichnis, aus dem die Anwendung heraus
> gestartet wird. Würde es nicht existieren, dann hätte ich gar nicht starten können ...


Ob es existiert ist eine Frage. Die andere ob man die Rechte hat in das Verzeichnis zu schreiben (was für das Applikationsverzeichnis evtl. etwas unüblich ist). Und mit temporärem Verzeichnis meine ich einfach das Verzeichnis in dem die temporäre Datei gespeichert wird. (ob da jetzt %TEMP% benutzt wird oder nicht).


vfl_freak hat gesagt.:


> Es ist ja leider unter Java wegen der Plattform-Unabhängigkeit leider etwas schwierig, an besagte MAC-Adresse auf anderem Weg zu kommen. Da unsere Anwendung ohnehin nur unter WIN-OS betrieben, wäre der alternative Weg wohl nur über das JNI zu gehen ... und der Aufwand dafür ist mir/uns einfach zu groß


Du könntest stattdessen JNA verwenden.

Und warum liest du nicht einfach die Standardausgabe von ipconfig (welches du doch sicherlich aufrufst, oder?)? Du vermeidest jede Menge Probleme und hättest Code (und Zeit und Geld) gespart.

Gruß


----------



## dux (25. März 2010)

deepthroat hat gesagt.:


> Hi.
> 
> Du kannst dem ifconfig Programm das gewünschte Interface angeben, dann wird nur dieses eine Interface aufgelistet.
> 
> ...


Danke erstmal für die schnell Antwort. In der Aufgabestellung steht, dass man nur Awk benutzen darf dazu darf man keinen Interface Explizit auswählen, also nur aus ifconfig   . Wie gesagt ich habe es soweit geschafft alle IPs zu lesen nur die Filterung klappt irgendwie nicht bei mir. Gruß


----------



## deepthroat (25. März 2010)

dux hat gesagt.:


> Danke erstmal für die schnell Antwort. In der Aufgabestellung steht, dass man nur Awk benutzen darf dazu darf man keinen Interface Explizit auswählen, also nur aus ifconfig   . Wie gesagt ich habe es soweit geschafft alle IPs zu lesen nur die Filterung klappt irgendwie nicht bei mir. Gruß


Welches AWK verwendest du? Werden multiline Records unterstützt? Dann mußt du nur überprüfen ob $1 == wlan0 ist.

Gruß


----------



## dux (25. März 2010)

deepthroat hat gesagt.:


> Welches AWK verwendest du? Werden multiline Records unterstützt? Dann mußt du nur überprüfen ob $1 == wlan0 ist.
> 
> Gruß


Hi, leider verstehe ich nicht was du mit "multiline Records " meinst (mein OS ist UBUNTU 9.10). und wie soll ich das Code ändern das es klappt (sorry ich bin noch Newbie)

```
#!/usr/bin/awk -f
#Ip von Wlan0 auslesen
BEGIN{
	system("ifconfig >IPDaten")
}

{}

END{
	while(getline<"IPDaten")
	{
		if($1=="inet")
		{
			print substr($2,9,20);
		}
	}
}
```
Besten Dank.


----------



## deepthroat (25. März 2010)

dux hat gesagt.:


> Hi, leider verstehe ich nicht was du mit "multiline Records " meinst


Und auf die Idee zu suchen bist du nicht gekommen weil... ? http://www.google.de/search?q=awk+multiline+Records&ie=utf-8&oe=utf-8&aq=t


dux hat gesagt.:


> (mein OS ist UBUNTU 9.10)


Dann hast du vermutlich mawk oder GNU awk welche beide multiline Records unterstützen.

Gruß


----------



## vfl_freak (25. März 2010)

deepthroat hat gesagt.:


> Die Datei sollte einen zufälligen Namen haben (Tip 4).


Ok, das ist zu überlegen - Danke für die Idee!



deepthroat hat gesagt.:


> Ob es existiert ist eine Frage.
> Die andere ob man die Rechte hat in das Verzeichnis zu schreiben (was für das Applikationsverzeichnis evtl. etwas unüblich ist)


Wie gesagt, wenn es NICHT ex., kann ich die Applikation gar nicht erst starten .....



deepthroat hat gesagt.:


> Du könntest stattdessen JNA verwenden.


Ah, dass muss ich mir mal näher anschauen 



deepthroat hat gesagt.:


> Und warum liest du nicht einfach die Standardausgabe von ipconfig (welches du doch sicherlich aufrufst, oder?)? Du vermeidest jede Menge Probleme und hättest Code (und Zeit und Geld) gespart.


Weil ich nicht wüsste, wie ich das von Java aus bewerkstelligen sollte .... :-(
Die einzige Chance ist wohl nur

```
Runtime.getRuntime().exec( "cmd /c ipconfig /all >  c:\\...\\ipconfig.txt" );
```
zur Erzeugung einer Textdatei, die anschließend ausgelesen und nach der Mac-Adresse geparst werden kann

Gruß
Klaus


----------



## dux (25. März 2010)

deepthroat hat gesagt.:


> Und auf die Idee zu suchen bist du nicht gekommen weil... ? http://www.google.de/search?q=awk+multiline+Records&ie=utf-8&oe=utf-8&aq=t
> 
> Dann hast du vermutlich mawk oder GNU awk welche beide multiline Records unterstützen.
> 
> Gruß


ich habe zwar Prinzip verstanden leider klappt es bei mir nicht!! so sieht jetzt aus 
	
	
	



```
...
if($1=="wlan0")
		{
			print substr($2,9,20);
		}
.....
```
 was mache ich nun falsch?


----------



## deepthroat (25. März 2010)

vfl_freak hat gesagt.:


> Weil ich nicht wüsste, wie ich das von Java aus bewerkstelligen sollte .... :-(
> Die einzige Chance ist wohl nur
> 
> ```
> ...


Im einfachsten Fall:

```
ProcessBuilder pb = new ProcessBuilder( "ipconfig", "/all");
pb.redirectErrorStream( true );
Process p = pb.start();

p.getOutputStream().close(); // close Process' stdin
BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream());

String line;
while (line = r.readLine()) {
  System.out.println(line);
}
```
Gruß



dux hat gesagt.:


> ich habe zwar Prinzip verstanden leider klappt es bei mir nicht!! so sieht jetzt aus
> 
> 
> 
> ...


Wie kommst du auf $2, 9, 20 ?

Wie ist die Ausgabe?

Wie hast du RS gesetzt?

Gruß


----------



## dux (25. März 2010)

> Wie kommst du auf $2, 9, 20 ?


Bsp : Zeile 1 hat $1
          Zeile 2 hat $2
..etc


> Wie ist die Ausgabe?


ich bekomme nicht zu sehen


> Wie hast du RS gesetzt?


RS?

```
#!/usr/bin/awk -f 

BEGIN{
	system("ifconfig >ifconfig")
}

{

}

END{
	while(getline<"ifconfig")
	{	
		if($1=="wlan0")
		{
			print substr($2,9,20);
		}

	}
}
```
Gruß


----------



## deepthroat (25. März 2010)

dux hat gesagt.:


> RS?


Ich dachte du hast das Multiline Record Konzept verstanden? Und das du dafür RS setzen mußt? Lies dir das (http://www.gnu.org/manual/gawk/html_node/Multiple-Line.html) nochmal durch.

Gruß


----------

