Befehl zum Suchen der Netzwerkschnittstelle für IP

12

Mit ipconfigkann ich die Liste der Netzwerkadapter und deren Einstellungen anzeigen, zB die IP-Adresse.

Ich suche nach einem umgekehrten Befehl, der den Namen des Netzwerkadapters für eine bestimmte IP-Adresse anzeigt.

Ich habe versucht, die Ausgabe ipconfigmit einem Befehl wie zu filtern, ipconfig | find "192.168.2.4"aber dann ist der Adaptername weg.

Meine Ausgabe von ipconfigist (der schwierige Teil scheint, dass ich hier mehrere Adressen auf einem Adapter habe):

Windows IP Configuration


Ethernet adapter Local Area Connection:

   Connection-specific DNS Suffix  . :
   Link-local IPv6 Address . . . . . : fe80::xxxx:xxxx:xxxx:xxxx%11
   IPv4 Address. . . . . . . . . . . : 192.168.2.4
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   IPv4 Address. . . . . . . . . . . : 192.168.178.20
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . : 192.168.178.1
                                       192.168.2.1

Ethernet adapter VMware Network Adapter VMnet1:
...
Thomas Weller
quelle
Für eine bestimmte lokale Adresse oder um herauszufinden, mit welchem ​​Schnittstellenrouting eine bestimmte Remote-Adresse erreicht wird?
Ben Voigt
@BenVoigt: Dies ist eine Adresse, die einer Netzwerkschnittstelle zugewiesen ist. Das Ergebnis sollte also nur ein Adapter sein. Wenn es um Routing geht, kann das Ergebnis viele Adapter sein (möglicherweise mit unterschiedlichen Metriken).
Thomas Weller

Antworten:

8

Wie zeige ich den Namen eines Netzwerkadapters für eine bestimmte IP-Adresse an?

Diese Lösung ist nicht erforderlich alle externen Kommandos ( pcre2grep, sedusw.).

Verwenden Sie die folgende Batchdatei (getname.cmd):

@echo off
setlocal
setlocal enabledelayedexpansion
set "_adapter="
set "_ip="
for /f "tokens=1* delims=:" %%g in ('ipconfig /all') do (
  set "_tmp=%%~g"
  if "!_tmp:adapter=!"=="!_tmp!" (
    if not "!_tmp:IPv4 Address=!"=="!_tmp!" (
      for %%i in (%%~h) do (
      if not "%%~i"=="" set "_ip=%%~i"
      )
    set "_ip=!_ip:(Preferred)=!"
    if "!_ip!"=="%1" (
        @echo !_adapter!
      )
    )
  ) else (
    set "_ip="
    set "_adapter=!_tmp:*adapter =!"
  )
)
endlocal

Verwendungszweck:

getname ipaddress

Beispiel:

F:\test>getname 192.168.42.78
Local Area Connection 2
F:\test>

Weiterführende Literatur

DavidPostill
quelle
1
Das ist interessant, David ... fast programmiert! Ihre Idee brachte mich zum Nachdenken, ich
poste
3
@SalvoF Es ist zu programmieren. Batch hat Variablen goto, for, if, Funktionen, Makros ... was braucht man mehr? ;)
DavidPostill
Ich wusste das nicht, bis ich mich fragte, was mit meiner Netzwerkkonfiguration passiert ist :-)
Thomas Weller
@ThomasWeller Weißt du schon wie es passiert ist?
DavidPostill
Nicht genau. Es ist sicherlich passiert, als ich meine 2 DSL-Leitungen eingerichtet habe. Ich habe 2 DSL-Modems. Sie konkurrierten mit DCHP, also habe ich eine feste Adresse eingerichtet. Dafür wurde jedoch nur ein DSL-Modem verwendet, das zweite wurde ignoriert. Einige Kollegen haben dafür gesorgt, dass es für 2 Modems funktioniert, möglicherweise durch Festlegen von 2 festen Adressen. Seitdem funktionieren einige meiner Batch-Dateien (und andere Dinge) nicht mehr wie erwartet. Daher die Frage.
Thomas Weller
6

Sie könnten diesen PS One Liner verwenden:

$addr='192.168.2.4'; get-wmiobject Win32_NetworkAdapterConfiguration |? {$_.ipaddress -contains $addr} |select Description |% {$_.Description}

So verwenden Sie es direkt über die Befehlszeile:

powershell "$addr='192.168.2.4'; get-wmiobject Win32_NetworkAdapterConfiguration |? {$_.ipaddress -contains $addr} |select Description |% {$_.Description}"

oder wenn Sie es wiederverwenden möchten, fügen Sie es in ein Skript ein und machen Sie die Adresse zu einem Parameter

Bearbeiten: um einen Namen zu erhalten, wie er in Win / Ipconfig angezeigt wird:

$addr='192.168.2.4'; 
$netconf = get-wmiobject Win32_NetworkAdapterConfiguration |? {$_.ipaddress -contains $addr};
$netconf |% {$_.GetRelated("win32_NetworkAdapter")} | select NetConnectionID |%{$_.NetConnectionID}

(Die Zuordnung zu Zwischenvariablen dient nur dazu, die Lesbarkeit zu verbessern.)

wmz
quelle
Das ist cool und gibt den HW-Namen zurück. Auf meinem System $powershellist dies jedoch nicht definiert. Ich starte diese Befehle mit powershell -cder Eingabeaufforderung. Auf der PS-Befehlszeile wird auch der erste Einzeiler ausgeführt.
SΛLVΘ
1
@ThomasWeller, der in der Tat ein Name Ihres Netzwerkadapters ist, wie Sie gemäß Ihrer Frage. Aber lassen Sie mich überprüfen, logischer Name sollte auch
verfügbar sein
2
Es ist auf einem anderen Tisch @wmz. PS rockt allerdings:powershell "$ip = '192.168.2.4';foreach($int in (gwmi Win32_NetworkAdapter)) {gwmi Win32_NetworkAdapterConfiguration -Filter """Index = $($int.index)""" | ? {$_.IPAddress -contains $ip} | % {$int.NetConnectionID} }"
SΛLVΘ
1
@ThomasWeller Überprüfen Sie meine Bearbeitung. Das war härter als ich dachte! Glücklicherweise unterstützt PS, GetRelatedwas die Associators ofMethoden ein wenig vereinfacht .
Wmz
1
@ SalvoF Yup Ich fand es
wmz
4

Ich suche nach einem umgekehrten Befehl, der den Namen des Netzwerkadapters für eine bestimmte IP-Adresse anzeigt.

Basierend auf allem, was ich versucht habe, sollte dies funktionieren. Sie scheinen zu sagen, dass Sie diese Informationen NUR von der IP-Adresse erhalten müssen, die Sie bereits in Ihrem Beispiel angegeben haben.

INTERAKTIVES PROMPT FÜR IP-ADRESSE, UM DEN NETZWERKVERBINDUNGSNAMEN ZU ERHALTEN

(Verwenden Sie WMICund einige Batch- FORSchleifen tokenund delimParsing, um den Netzwerkverbindungsnamen für eine angegebene IP-Adresse abzurufen.)

(Der Ergebniswert wird in einem Befehlsfenster und einem Meldungsfeldfenster wiedergegeben. Es handelt sich ausschließlich um ein Batch-Skript, es werden jedoch dynamisch einige VBS-Skriptfunktionen erstellt, um den Prozess für alle Benutzer zu vereinfachen.)

@ECHO ON

:SetTempFiles
SET tmpIPaddr=%tmp%\~tmpipaddress.vbs
SET tmpNetConName1=%tmp%\~tmpNetConName1.txt
SET tmpNetConName2=%tmp%\~tmpNetConName2.txt
SET tmpBatFile=%tmp%\~tmpBatch.cmd
SET tmpVBNetCon=%tmp%\~tmpVBNetCon.vbs

IF EXIST "%tmpIPaddr%" DEL /F /Q "%tmpIPaddr%"
IF EXIST "%tmpNetConName1%" DEL /Q /F "%tmpNetConName1%"
IF EXIST "%tmpNetConName2%" DEL /Q /F "%tmpNetConName2%"
IF EXIST "%tmpBatFile%" DEL /Q /F "%tmpBatFile%"
IF EXIST "%tmpVBNetCon%" DEL /Q /F "%tmpVBNetCon%"

:InputBox
SET msgboxTitle=IP ADDRESS
SET msgboxLine1=Enter the IP address to get its Windows connection name
>"%tmpIPaddr%" ECHO wsh.echo inputbox("%msgboxLine1%","%msgboxTitle%")
FOR /F "tokens=*" %%N IN ('cscript //nologo "%tmpIPaddr%"') DO CALL :setvariables %%N
GOTO EOF

:setvariables
SET IPAddress=%~1
FOR /F "USEBACKQ TOKENS=3 DELIMS=," %%A IN (`"WMIC NICCONFIG GET IPADDRESS,MACADDRESS /FORMAT:CSV | FIND /I "%IPAddress%""`) DO (SET MACAddress=%%~A)
FOR /F "USEBACKQ TOKENS=3 DELIMS=," %%B IN (`"WMIC NIC GET MACADDRESS,NETCONNECTIONID /FORMAT:CSV | FIND /I "%MACAddress%""`) DO ECHO(%%~B>>"%tmpNetConName1%"

::: Parse Empty Lines
FINDSTR "." "%tmpNetConName1%">"%tmpNetConName2%"

::: Build Dynamic Batch with ECHO'd Network Connection Value
FOR /F "tokens=*" %%C IN (%tmpNetConName2%) DO ECHO ECHO %%~C>>"%tmpBatFile%"
IF NOT EXIST "%tmpBatFile%" GOTO :NullExit
START "" "%tmpBatFile%"

::: Build Dynamic VBS with Message Box Network Connection Value
FOR /F "tokens=*" %%C IN (%tmpNetConName2%) DO (SET vbNetconName=%%~C)
ECHO msgbox "%vbNetconName%",0,"%vbNetconName%">"%tmpVBNetCon%"
START /B "" "%tmpVBNetCon%"
EXIT /B

:NullExit
ECHO msgbox "Cannot find MAC Address, check to confirm IP Address was correct.",0,"Invalid IP">"%tmpVBNetCon%"
START /B "" "%tmpVBNetCon%"
EXIT /B

ALLE EINLINER

NATIVE WINDOWS NUR MIT NETSH ALLEN SCHNITTSTELLEN (ALLE IPv4-ADRESSEN)

NETSH INT IP SHOW CONFIG | FINDSTR /R "Configuration for interface.* Address.*[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*"

Geben Sie hier die Bildbeschreibung ein

NATIVE WINDOWS NUR MIT IPCONFIG ALL INTERFACES (ALLE IPv4-ADRESSEN)

IPCONFIG | FINDSTR /R "Ethernet* Address.*[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*"

Geben Sie hier die Bildbeschreibung ein


VERWENDUNG VON PCRE2GREP (per @SalvoF)

EINZEL-IP-ADRESSE ANGEGEBEN

netsh interface ipv4 show address | pcre2grep -B2 "192\.168\.2\.4" | FIND /V "DHCP"

FINDEN SIE ALLE IP-ADRESSEN

netsh interface ip show config | pcre2grep -B2 ^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$ | FIND /V "DHCP" | FIND /V "Gate" | FIND /V "Metric" | FIND /V "Subnet"

ALLE IP-ADRESSEN FINDEN (Regex bereinigt (per @SalvoF))

netsh interface ip show config | pcre2grep "^[A-Z]|IP.*([0-9]{1,3}(\.|)){4}"

Bitte beachten Sie, dass das, was pcre2grepich versucht habe, per @SalvoF ist, [+1]wie er vorgeschlagen hat, aber die Verwendung der .... FIND /V, um die obige Zeile zu entfernen, DHCPscheint die gewünschte Ausgabe zu erhalten, wie Sie beschrieben haben. Ich habe NETSHeher als IPCONFIGauch verwendet.

Zuhälter Saft IT
quelle
Dadurch werden einige zusätzliche Informationen auf meinen Computern abgerufen (z. B. Netzwerkmasken usw.). Mein Punkt war, dass Sie für den Fall, dass Sie mehrere IP-Adressen haben, keine "feste" Regel mehr haben, um zum Namen der Schnittstelle zu gelangen. Das anfängliche Q lautet: mit einer IP-Nr. Wie finde ich die Schnittstelle, zu der sie gehört? Ich habe nicht nach allen IPs gesucht.
SΛLVΘ
2
Vielen Dank für Ihre Beiträge! Übrigens bemerkte ich, dass führende und nachfolgende Linien auf meiner Seite auf Sprachprobleme zurückzuführen waren. Was denkst du darüber, um diese zu umgehen? netsh interface ip show config | pcre2grep "^[A-Z]|IP.*([0-9]{1,3}(\.|)){4}"(Ich habe den Regex ein bisschen gereinigt). Ich lerne viel um diesen Ort!
SΛLVΘ
+1 Danke für den Vorschlag. Es hat immer noch zu viel Ausgabe für meine Verwendung.
Thomas Weller
3

Um genauer zu sein, würde ich nach dem Beispiel von OP verwenden sed, das sich im \usr\local\wbinOrdner dieser komprimierten Datei befindet (UnxUtils-Projekt).

ipconfig | sed -rn "/^[A-Z]/h;/192.168.2.4/{g;s/.* adapter (.*):/\1/p;}"

-nunterdrückt nicht übereinstimmende Zeilen; Das erste Muster findet eine Zeile, die mit einem Großbuchstaben beginnt, und hlegt sie dann in den Haltebereich. Die zweite Übereinstimmung bezieht sich auf die gewünschte IP-Nummer: Zu diesem Zeitpunkt wird der Name der Zeilenhalteschnittstelle abgerufen ( g), zusätzlicher führender Text entfernt ( s) und gedruckt ( p).

SΛLVΘ
quelle
-B4funktioniert fast, es bleibt mir nur das Präfix "Ethernet-Adapter", das nicht zum Adapternamen + 4 Zeilen nicht verwandter Ausgabe gehört. Aber die Botschaft ist klar: Finde ein Werkzeug, das es macht :-)
Thomas Weller
1
Könnten Sie Ihren Beitrag aktualisieren, um ungefilterte ipconfigAusgabe anzuzeigen ? (Daten aus Datenschutzgründen
verschleiern
Ok, hinzugefügt. Es scheint auch schwierig zu sein, Adapter mit mehreren Adressen zu handhaben.
Thomas Weller
1
Das ist genial @PJMahoney. Was wäre die Ausgabe mit mehreren IP-Adressen? Ich bemühte mich um eine allgemeine Lösung mit sed; Vielleicht kann auch Ihre Lösung optimiert werden, um dieses Ziel zu erreichen.
SΛLVΘ
Das sed funktioniert, wenn ich ein anderes hinzufüge| sed -rn "s/^.* adapter (.*):/\1/p"
Thomas Weller
2

Nur zur Veranschaulichung, hier ist eine weitere Batch-Lösung, die die verzögerte Erweiterung der %ERRORLEVEL%Systemvariablen ausnutzt :

@echo off
setlocal EnableDelayedExpansion
for /f "delims=" %%L in ('ipconfig') do (
    echo %%L | findstr /r "^[A-Z]" 1>NUL
    if !errorlevel! == 0 set "_int=%%L"
    echo %%L | findstr /c:%1 1>NUL
    if !errorlevel! == 0 (
       set "_int=!_int::=!"
       echo !_int:* adapter =!
       goto:eof
    )
)

Es kann folgendermaßen aufgerufen werden: find_int.cmd 192.168.1.100

SΛLVΘ
quelle
Hehe. Das ist eine saubere reine Batch-Lösung. Gut gemacht;)
DavidPostill
+1 Die Ausgabe kommt dem sehr nahe, was ich brauche. Vielen Dank
Thomas Weller
Ich habe den sedEinzeiler bearbeitet und den Namen der Benutzeroberfläche als einzige Ausgabe belassen. Natürlich können Sie auch dafür eine einfache Batch-Datei schreiben, indem Sie die IP-Nr. als Argument ( %1).
SΛLVΘ
@ThomasWeller, auch dieses gestimmt. Prost!
SΛLVΘ
1

Vielen Dank für die Mühe an alle. Es scheint, dass es mehrere Hürden gibt:

  • Die Anzahl der einem Adapter zugewiesenen IP-Adressen
  • die Sprache des Betriebssystems

All das -Bxund Regex-Zeug scheint leicht zu brechen, also habe ich nach etwas gegoogelt, das ich selbst implementieren könnte, und mir das folgende C # -Programm ausgedacht, das die IP-Adresse als Parameter ( IP2Adapter <IP>) verwendet:

using System;
using System.Net.NetworkInformation;
using System.Net.Sockets;

namespace IP2Adapter
{
    class Program
    {
        static void Main(string[] args)
        {
            var adapters = NetworkInterface.GetAllNetworkInterfaces();
            foreach (var adapter in adapters)
            {
                var ipProps = adapter.GetIPProperties();
                foreach (var ip in ipProps.UnicastAddresses)
                {
                    if ((adapter.OperationalStatus == OperationalStatus.Up)
                        && (ip.Address.AddressFamily == AddressFamily.InterNetwork))
                    {
                        if (ip.Address.ToString() == args[0])
                        Console.Out.WriteLine(adapter.Name);
                    }
                }
            }
        }
    }
}
Thomas Weller
quelle
0

Unter Windows 10 Powershell kann dies folgendermaßen erreicht werden:

Get-NetIPAddress -IPAddress '192.168.2.4' | %{$_.InterfaceAlias};

Dies ergibt ein Ergebnis wie Wi-Fi.

Wo Sie InterfaceAliasjede andere Objekteigenschaft ersetzen können.

Um alle Eigenschaften zu erhalten, lassen Sie einfach die Pipes weg und führen Sie Folgendes aus : Get-NetIPAddress -IPAddress '192.168.2.4'.

Andere netzwerkadapterbezogene Eigenschaften (wie z. B. Beschreibung) können normalerweise basierend auf InterfaceAliasoder abgefragt werden InterfaceIndex, z.

Get-NetAdapter -InterfaceAlias Wi-Fi | %{$_.InterfaceDescription};

Welches wird so etwas geben wie : Intel(R) Dual Band Wireless-AC 8265.

Weitere Informationen finden Sie in den Dokumenten: https://docs.microsoft.com/en-us/powershell/module/nettcpip/get-netipaddress?view=win10-ps

MrMeszaros
quelle