dysti99
Goto Top

Tabellarische Ausgabe der Netzwerkschnittstellen

Mit - ip a - werden ja die Netzwerkschnittstellen angezeigt.
Ich möchte mit ein Batchscript folgende Ausgabe erreichen:

1 eth0 192.168.1.1 AD:13:67:56:14:D1

2 eth1 192.168.0.45 12:45:DF:76:52:99

Bekomme es einfach nicht hin.

Content-ID: 657738

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

Ausgedruckt am: 22.11.2024 um 04:11 Uhr

Doskias
Doskias 01.03.2021 um 09:10:37 Uhr
Goto Top
Moin,

wieder einmal die Frage zum Anfang: Wieso Batch und nicht Powershell? Meiner Meinung nach gibt es keinen Grund sich heutzutage auf Batch zu versteifen und die Möglichkeiten in Powershell nicht zu nutzen. Alles was du brauchst findest du in Powershell mit:
Get-Netadapter | format-list -Property *
Get-Wmiobject Win32_NetworkAdapterConfiguration -Filter "IPEnabled=true"   

Gruß
Doskias
lcer00
lcer00 01.03.2021 um 09:25:07 Uhr
Goto Top
Hallo,
Zitat von @Doskias:

Moin,

wieder einmal die Frage zum Anfang: Wieso Batch und nicht Powershell? Meiner Meinung nach gibt es keinen Grund sich heutzutage auf Batch zu versteifen und die Möglichkeiten in Powershell nicht zu nutzen. Alles was du brauchst findest du in Powershell mit:
Get-Netadapter | format-list -Property *
> Get-Wmiobject Win32_NetworkAdapterConfiguration -Filter "IPEnabled=true"   
und dabei geht es auch noch so schick einzeilig. Nimm bitte Powershell.

Grüße

lcer
em-pie
em-pie 01.03.2021 aktualisiert um 09:30:30 Uhr
Goto Top
Moin,

@Doskias & @lcer00
Ich gehe davon aus, dass er in einer Unix-Distribution unterwegs ist oder kennt ihr den Befehl ip a unter Windows?

Denn die Powershell wird ihm nicht viel nützen face-wink

Gruß
em-pie
fredmy
fredmy 01.03.2021 um 09:40:01 Uhr
Goto Top
Hallo,
@icer00 und @Doskias

und wie geht ip a unter Powershell ?
IIRR ist ip a ein unixoides Kommando.... gerht Powershell jetzt auch unter unixoiden Systemen ?

(denke da an Linux, BSD...)
evtl. sucht der TO sowas wie arp ?

Fred
SeaStorm
SeaStorm 01.03.2021 um 09:42:49 Uhr
Goto Top
Seit wann ist batch unixoid?

Und ja, PS geht unter Linux
Doskias
Doskias 01.03.2021 um 09:44:14 Uhr
Goto Top
Zitat von @em-pie:
Ich gehe davon aus, dass er in einer Unix-Distribution unterwegs ist oder kennt ihr den Befehl ip a unter Windows?
Ich kenn Unix nicht wirklich. Ist schon mehr als 1 Jahrzehnt her, dass ich damit gearbeitet habe. Da es in der Eröffnung nicht explizit erwähnt wurde, bin ich erstmal von Windows ausgegangen, denn das ist weiter verbreitet als Unix. Und da weder Begrüßung noch Verabschiedung steht, bin ich weiter davon ausgegangen, dass dysti99 sich gerne kurz hält und habe ip a als Kurzform für ipconfig /all interpretiert. Jetzt nach deinem Unix Einwurf denke ich aber auch, dass ich mit meiner Interpretation wohl falsch lag face-smile

Denn die Powershell wird ihm nicht viel nützen face-wink
Aber vielleicht lernt er ja daraus, wie wichtig es ist alle relevanten Infos in einer Frage zu erwähnen. Dann hat es doch was genützt face-smile
Doskias
Doskias 01.03.2021 um 09:45:18 Uhr
Goto Top
147669
Lösung 147669 01.03.2021 aktualisiert um 11:55:30 Uhr
Goto Top
Ich möchte mit ein Batchscript folgende Ausgabe erreichen:
Du meist wohl ein Bash oder Shell Skript, Windows Batch gibt es unter Linux nicht.
for link in $(ip -br a | cut -d " " -f1); do mac=$(ip a show dev $link | grep -Po '(?<=link/ether )[^ ]+');ip=$(ip a show dev $link | grep -Po '(?<=inet )[^ ]+'); printf "%8s\t%15s\t%17s\n" "$link" "$ip" "$mac";done  
Oder alternativ formatiert mit "column" command
for link in $(ip -br a | cut -d " " -f1); do mac=$(ip a show dev $link | grep -Po '(?<=link/ether )[^ ]+');ip=$(ip a show dev $link | grep -Po '(?<=inet )[^ ]+'); echo "$link;$ip;$mac";done | column -N INTERFACE,IP,MAC -t -s";"  
Gruß SK
lcer00
lcer00 01.03.2021 aktualisiert um 10:10:23 Uhr
Goto Top
Hallo,

OK, Powershell war dann nicht nicht so die Lösung.

Der Begriff Batch ( https://de.wikipedia.org/wiki/Stapelverarbeitung ) ist da sicher nicht hilfreich, ich rede bei Linux immer von (Shell)Skript ....
Zitat von @147669:

> for link in $(ip link | grep -Po '(?<=^\d: )[^:]+'); do mac=$(ip a show dev $link | grep -Po '(?<=link/ether )[^ ]+');ip=$(ip a show dev $link | grep -Po '(?<=inet )[^ ]+'); printf "%8s\t%15s\t%17s\n" "$link" "$ip" "$mac";done  
> 
Oder alternativ formatiert mit "column" command
> for link in $(ip link | grep -Po '(?<=^\d:) [^:]+'); do mac=$(ip a show dev $link | grep -Po '(?<=link/ether )[^ ]+');ip=$(ip a show dev $link | grep -Po '(?<=inet )[^ ]+'); echo "$link;$ip;$mac";done | column -N INTERFACE,IP,MAC -t -s";"  
> 
Womit mal wieder die Überlegenheit der Linux-Shell demonstriert werden konnte: Scheller, kürzer, prägnanter geht es nicht face-smile

Grüße

lcer
em-pie
em-pie 01.03.2021 um 10:12:29 Uhr
Goto Top
Zitat von @Doskias:

Zitat von @em-pie:
Ich gehe davon aus, dass er in einer Unix-Distribution unterwegs ist oder kennt ihr den Befehl ip a unter Windows?
Ich kenn Unix nicht wirklich. Ist schon mehr als 1 Jahrzehnt her, dass ich damit gearbeitet habe. Da es in der Eröffnung nicht explizit erwähnt wurde, bin ich erstmal von Windows ausgegangen, denn das ist weiter verbreitet als Unix. Und da weder Begrüßung noch Verabschiedung steht, bin ich weiter davon ausgegangen, dass dysti99 sich gerne kurz hält und habe ip a als Kurzform für ipconfig /all interpretiert. Jetzt nach deinem Unix Einwurf denke ich aber auch, dass ich mit meiner Interpretation wohl falsch lag face-smile
Nun gut, von der Seite hatte ich das noch nicht betrachtet face-smile

Denn die Powershell wird ihm nicht viel nützen face-wink
Aber vielleicht lernt er ja daraus, wie wichtig es ist alle relevanten Infos in einer Frage zu erwähnen. Dann hat es doch was genützt face-smile
Full ACK

Wieder etwas gelernt face-smile
147669
147669 01.03.2021 aktualisiert um 10:18:56 Uhr
Goto Top
Nur zur Info, das Get-Netadapter CMDLet und auch WMI etc. existieren unter Linux nicht face-wink.
AlRoDiSa
AlRoDiSa 01.03.2021 um 10:35:10 Uhr
Goto Top
Versuch einfach mal:
ip -br addr show

Kann man in eine Datei umleiten bzw. mit "grep" oder "awk" etwas filtern

Viel Erfolg

Zu PS unter Unix... wohl eher zur Nutzung unter WSL gedacht? Wer sonst tut sich das unter reinem *nix an?
face-wink
dysti99
dysti99 01.03.2021 um 10:48:06 Uhr
Goto Top
Mist. Ein Schreibfehler. Ich meinte bash und mein OS ist Debian Buster.
Danke für die vielen Antworten und Schmitzkatz hat mich auf den Pfad
der Tugend zurück geführt. Manchmal kann eine zuviel eingefügte Leerstelle
zur Verzweiflung führen.
colinardo
colinardo 01.03.2021 aktualisiert um 12:47:33 Uhr
Goto Top
Zitat von @lcer00:
Womit mal wieder die Überlegenheit der Linux-Shell demonstriert werden konnte: Scheller, kürzer, prägnanter geht es nicht face-smile
Kürzer geht immer face-smile

ip -j a | jq -r '. | [.ifname,(.addr_info | map(select(.family == "inet"))[0].local),.address] | join(";")'| column -N INTERFACE,IP,MAC -t -s";"  
Grüße Uwe
GarfieldBonn
GarfieldBonn 01.03.2021 um 14:55:18 Uhr
Goto Top
Ein gebasteltes Powershell 7 Skript unter Linux:

$HostIP = ip -br addr show

foreach($HI in $HostIP) {
        1. Interfacename
        $Interface = ($HI.split(" "))
              1. Status des Interfaces
              $IStatus = ((($HI.TrimStart($Interface)).Trim()).Split(" "))
                    1. Rest muss für IP noch zerlegt werden
                    $Rest = $HI.split($Istatus).Trim()
                    $IP = $Rest.Split("/")[1]
                          1. MAC in Zwei Zeilen ermitteln
                          $MAC = ip link show $Interface | grep ether


                                1. Ausgabe für alle aktiven Interfaces ausser Loopback
                                IF ($IStatus -eq "UP") {
                                IF ($Interface -ne "lo") {
                                            1. Aktuelle MAC erst jetzt ermitteln, da nicht für alle interface so vorhanden face-smile
                                            $MAC = (($MAC.split("ether").TRIM())[1].Split(" "))
                                            write-host $Interface, $Istatus, $IP, $MAC
                                            }
                                            }
                                            }
Lochkartenstanzer
Lochkartenstanzer 01.03.2021 um 15:24:01 Uhr
Goto Top
Zitat von @fredmy:

... gerht Powershell jetzt auch unter unixoiden Systemen ?

Ja

lks
Lochkartenstanzer
Lochkartenstanzer 01.03.2021 um 15:33:37 Uhr
Goto Top
Zitat von @SeaStorm:

Seit wann ist batch unixoid?

Batch ist weder unixoid noch kleinweichig, sondern universeller. Batchprogrammierung stammt aus der Zeit von Lochkartenstapeln (batch=Stapel) und deren Verarbeitung und heißt im prinzip nichts anderes als eine Abfolge von Kommandos auszuführen. Heutzutage versteht man darunter alle möglichen "Programme" in interpretierten Skriptsprachen , wie z.B. bash, rexx, cmd-shell, csh, etc.

Daher kann mit "batch" alles Mögliche gemeint sein, auch wenn die Kiddies heutzutage nur die CMD-Shell-Skripte verstehen.


Ich persönlich hätte mit einem bash-skript geantwortet, aber die Lösungen sind ja inzwischen gepostet worden.

lks
colinardo
colinardo 01.03.2021 aktualisiert um 16:29:15 Uhr
Goto Top
Zitat von @GarfieldBonn:
Ein gebasteltes Powershell 7 Skript unter Linux:
Das geht dann doch eleganter face-wink.
ip -j a | convertfrom-JSON | select IfIndex,@{n='MAC';e={$_.address}},@{n='IP';e={$_.addr_info | ? family -eq 'inet' | select -Expand local}}  
Grüße Uwe
TomTomBon
TomTomBon 02.03.2021 um 08:44:07 Uhr
Goto Top
Moin Moin,
Ich schaue derzeit in beide Bereiche etwas mehr rein.
Bash weil Ich privat auf Mint umsteige, PS für die Arbeit.
Und ja, so langsam steige Ich durch PS mehr durch. Die Fragezeichen werden weniger :-p

Aber Ich finde immer noch, und immer mehr, das bash logischer strukturiert ist!
face-wink

Nur meine Meinung
147669
147669 02.03.2021 aktualisiert um 11:57:07 Uhr
Goto Top
Zitat von @TomTomBon:
Aber Ich finde immer noch, und immer mehr, das bash logischer strukturiert ist!
Das Wie Äppel und Birnen vergleichen. Das eine (Bash) ist jahrzehnte gewachsen und besteht aus X unterschiedlichen Tools die man zu einem ganzen zusammenwürfelt. PS dagegen wurde von Grund auf neu auf einem Framework (.NET) aufgebaut und ist mit dem CMDLet-Paradigma eher logischer aufgebaut wo man bei Bash sich eben als Neueinsteiger erst mal die abgekürzten Befehle erst mal zusammensuchen muss, ergeben sich die Befehle bei der PS meist wie von selbst. Dort fragt man sich als erstes was will ich machen? Get-, Set, New- sind meist selbsterklärend, dahinter dann das was man machen will -Content -Process usw.
Beide Sprachen haben Ihre Berechtigungen, obwohl ich persönlich die PS nur auf der Windows-Seite nutze und unter Linux auch eher die Bash weil man in der PS doch für vieles doch noch wieder althergebrachte Befehle benutzen muss weil einfach noch CMDLets fehlen oder in .NET Core noch nicht umgesetzt wurden.

Just my 2 cent.