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:
...

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


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)


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ż.


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


-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


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);
                    }
                }
            }
        }
    }
}

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.