Polecenie znalezienia interfejsu sieciowego dla IP

14

Za pomocą ipconfigmogę wyświetlić listę kart sieciowych i ich ustawień, np. Adres IP.

Szukam polecenia odwrotnego, które wyświetla nazwę karty sieciowej dla danego adresu IP.

Próbowałem filtrować dane wyjściowe ipconfigza pomocą polecenia typu „ ipconfig | find "192.168.2.4"ale”, ale nazwa adaptera zniknęła.

Moje dane wyjściowe ipconfigto (podstępna część wydaje się, że mam tutaj kilka adresów na jednym adapterze):

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
źródło
Dla danego adresu lokalnego lub aby dowiedzieć się, jakiego routingu interfejsu używa się do osiągnięcia określonego adresu zdalnego?
Ben Voigt
@BenVoigt: jest to adres przypisany do interfejsu sieciowego, więc wynikiem powinien być tylko jeden adapter. Gdyby chodziło o routing, rezultatem może być wiele adapterów (potencjalnie o różnych metrykach).
Thomas Weller

Odpowiedzi:

8

Jak wyświetlić nazwę karty sieciowej dla danego adresu IP?

Rozwiązanie to nie wymaga żadnych zewnętrznych poleceń ( pcre2grep, seditp).

Użyj następującego pliku wsadowego (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

Stosowanie:

getname ipaddress

Przykład:

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

Dalsza lektura

DavidPostill
źródło
1
To ciekawe David ... prawie programuje! Twój pomysł sprawił, że pomyślałem,
wysyłam
3
@SalvoF It jest programowanie. Partia ma zmienne, goto, for, if, funkcje, makra ... co więcej trzeba? ;)
DavidPostill
Nie wiedziałem o tym, dopóki nie zastanawiałem się, co się stało z moją konfiguracją sieci :-)
Thomas Weller
@ThomasWeller Czy wiesz jeszcze, jak to się stało?
DavidPostill
Nie dokładnie. Z pewnością stało się tak, gdy skonfigurowałem 2 linie DSL. Mam 2 modemy DSL. Współzawodniczyli z DCHP, więc ustawiłem stały adres. Ale używał tylko jednego modemu DSL, ignorując drugi. Niektórzy koledzy sprawili, że działał on dla 2 modemów, potencjalnie przez ustawienie 2 stałych adresów. Od tego czasu niektóre moje pliki wsadowe (i inne rzeczy) nie działają już zgodnie z oczekiwaniami. Stąd pytanie.
Thomas Weller
6

Możesz użyć tej wkładki PS one:

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

Aby użyć go bezpośrednio z wiersza poleceń:

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

lub jeśli chcesz go ponownie użyć, umieść go w skrypcie i ustaw adres jako parametr

Edytuj: aby uzyskać nazwę wyświetlaną w Win / Ipconfig:

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

(przypisanie do zmiennych pośrednich ma jedynie na celu uczynienie go nieco bardziej czytelnym)

wmz
źródło
To jest fajne i zwraca nazwę HW. W moim systemie $powershelljest jednak niezdefiniowany, uruchamiam te polecenia za pomocą powershell -cwiersza polecenia. W wierszu poleceń PS działa również 1. linia jednoliniowa.
SΛLVΘ
1
@ThomasWeller, który w rzeczywistości jest nazwą twojej karty sieciowej zgodnie z Twoim pytaniem. Ale pozwól mi sprawdzić, logiczna nazwa powinna być również dostępna
wmz
2
Jest na innym stole @wmz. PS kołysze: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 Sprawdź moją edycję. To było trudniejsze niż myślałem! Na szczęście PS obsługuje, GetRelatedco Associators ofnieco ułatwia metody.
wmz
1
@SalvoF Tak, znalazłem to
wmz
4

Szukam polecenia odwrotnego, które wyświetla nazwę karty sieciowej dla danego adresu IP.

W oparciu o wszystko, co próbowałem, powinno to działać. Wydaje się, że musisz uzyskać te informacje TYLKO z adresu IP, który już podałeś w swoim przykładzie.

INTERAKTYWNY PYTANIE O ADRES IP, ABY UZYSKAĆ ​​NAZWĘ POŁĄCZENIA SIECIOWEGO

(Użyj WMICi trochę FORpętli wsadowej tokeni delimparsowania, aby uzyskać nazwę połączenia sieciowego dla określonego adresu IP).

(Wartość wyniku zostanie wyświetlona w oknie poleceń i oknie komunikatu. Jest to skrypt wsadowy, ale dynamicznie buduje niektóre funkcje skryptu VBS, aby uprościć proces każdemu, kto potrzebuje.)

@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

WSZYSTKIE JEDNORAZOWE

NATIVE WINDOWS TYLKO Z NETSH WSZYSTKIMI INTERFEJSAMI (WSZYSTKIE ADRESY IPv4)

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]*"

wprowadź opis zdjęcia tutaj

NATIVE WINDOWS TYLKO Z IPCONFIG WSZYSTKIMI INTERFEJSAMI (WSZYSTKIE ADRESY IPv4)

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

wprowadź opis zdjęcia tutaj


KORZYSTANIE Z PCRE2GREP (na @SalvoF)

OKREŚLONY JEDEN ADRES IP

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

ZNAJDŹ WSZYSTKIE ADRESY IP

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"

ZNAJDŹ WSZYSTKIE ADRESY IP (Oczyszczony Regex (według @SalvoF))

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

Zauważ, pcre2grepże próbowałem jest według @SalvoF, [+1]jak sugerował, ale użycie ...., FIND /Vaby usunąć powyższą linię, DHCPwydaje się otrzymywać pożądane wyjście, jak opisano. Użyłem NETSHraczej niż IPCONFIGrównież.

Pimp Juice IT
źródło
Przechwytuje to dodatkowe informacje na moich komputerach (takie jak maski sieciowe itp.). Chodzi mi o to, że jeśli masz wiele adresów IP, przestajesz mieć „ustaloną” regułę dostępu do nazwy interfejsu. Początkowe Q to: podany numer IP. jak znaleźć interfejs, do którego należy? Nie szukałem wszystkich adresów IP.
SΛLVΘ
2
Dziękujemy za twoje uwagi! BTW, zauważyłem, że wiodące i końcowe linie po mojej stronie były spowodowane problemami językowymi. Aby je obejść, co o tym sądzisz? netsh interface ip show config | pcre2grep "^[A-Z]|IP.*([0-9]{1,3}(\.|)){4}"(Trochę wyczyściłem regex). Dużo się uczę w tym miejscu!
SΛLVΘ
+1 dzięki za sugestię. Nadal ma za dużo danych wyjściowych do mojego użytku.
Thomas Weller,
3

Aby być bardziej dokładnym, podążając za przykładem OP, użyłbym sed, który można znaleźć w \usr\local\wbinfolderze tego skompresowanego pliku (projekt UnxUtils).

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

-npomija niepasujące linie; pierwszy wzór znajduje dowolną linię rozpoczynającą się od dużej litery, a następnie hodkłada ją na miejsce; drugie dopasowanie dotyczy żądanego numeru IP: w tym momencie przywoływana jest nazwa interfejsu wiersza ( g), usuwany jest dodatkowy wiodący tekst ( s) i drukowany ( p).

SΛLVΘ
źródło
-B4prawie działa, po prostu zostawia mi prefiks „adapter Ethernet”, który nie należy do nazwy adaptera + 4 wiersze niepowiązanego wyjścia. Ale przesłanie jest jasne: znajdź narzędzie, które to zrobi :-)
Thomas Weller
1
Czy możesz zaktualizować swój post, aby wyświetlał niefiltrowane ipconfigdane wyjściowe? (Ukryj lub zmień dane w celu zachowania prywatności)
SΛLVΘ
Ok, dodane. Wydaje się również, że obsługa adapterów z wieloma adresami jest trudna.
Thomas Weller,
1
To genialne @PJMahoney. Jaki byłby wynik z wieloma adresami IP? Starałem się znaleźć ogólne rozwiązanie, używając sed; być może twoje rozwiązanie może zostać zmodyfikowane, aby osiągnąć ten cel.
SΛLVΘ
Sed działa, jeśli dodam inny| sed -rn "s/^.* adapter (.*):/\1/p"
Thomas Weller
3

Dla przypomnienia, oto inne rozwiązanie wsadowe, które wykorzystuje opóźnione rozszerzenie %ERRORLEVEL%zmiennej systemowej:

@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
    )
)

Można go wywołać w ten sposób: find_int.cmd 192.168.1.100

SΛLVΘ
źródło
Hehe To schludne czyste rozwiązanie partii. Dobra robota;)
DavidPostill
+1 Wyjście jest bardzo zbliżone do tego, czego potrzebuję. Dzięki
Thomas Weller,
Edytowałem sedjednowierszowy, pozostawiając nazwę interfejsu jako jedyne wyjście. Oczywiście możesz również napisać prosty plik wsadowy, podając adres IP nr. jako argument ( %1).
SΛLVΘ
@ThomasWeller, również dostroił ten. Twoje zdrowie!
SΛLVΘ
1

Dzięki za wysiłek wszystkim. Wydaje się, że istnieje kilka przeszkód:

  • liczba adresów IP przypisanych do adaptera
  • język systemu operacyjnego

Wszystkie -Bxrzeczy i Regex wydają się łatwo psować, więc poszukałem czegoś, co mógłbym zaimplementować i wymyśliłem następujący program C #, który przyjmuje adres IP jako parametr ( IP2Adapter <IP>):

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
źródło
0

W systemie Windows 10 Powershell można to osiągnąć za pomocą:

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

To da wynik taki jak Wi-Fi.

Gdzie możesz zastąpić InterfaceAliasdowolną inną właściwość obiektu.

Aby uzyskać wszystkie właściwości, po prostu pominąć rur i uruchom: Get-NetIPAddress -IPAddress '192.168.2.4'.

Inne właściwości związane z kartą sieciową (takie jak Opis) można zwykle przeszukiwać na podstawie InterfaceAliaslub InterfaceIndexnp .:

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

Które dadzą coś takiego: Intel(R) Dual Band Wireless-AC 8265.

Przeczytaj więcej na temat dokumentów: https://docs.microsoft.com/en-us/powershell/module/nettcpip/get-netipaddress?view=win10-ps

MrMeszaros
źródło