Comando per trovare l'interfaccia di rete per IP


12

Con ipconfigposso mostrare l'elenco degli adattatori di rete e le loro impostazioni, ad es. L'indirizzo IP.

Sto cercando un comando inverso che visualizzi il nome della scheda di rete per un determinato indirizzo IP.

Ho provato a filtrare l'output di ipconfigcon un comando simile ipconfig | find "192.168.2.4"ma poi il nome dell'adattatore è sparito.

Il mio output di ipconfigè (la parte difficile sembra che io abbia diversi indirizzi su un adattatore qui):

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

Per un determinato indirizzo locale o per scoprire quale interfaccia di routing utilizza per raggiungere un determinato indirizzo remoto?
Ben Voigt,

@BenVoigt: è un indirizzo assegnato a un'interfaccia di rete, quindi il risultato dovrebbe essere un solo adattatore. Se si trattasse di routing, il risultato potrebbe essere molti adattatori (potenzialmente con metriche diverse).
Thomas Weller,

Risposte:


8

Come posso visualizzare il nome di una scheda di rete per un determinato indirizzo IP?

Questa soluzione non non richiede alcuna comandi esterni ( pcre2grep, sed, ecc).

Utilizzare il seguente file batch (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

Uso:

getname ipaddress

Esempio:

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

Ulteriori letture


1
È interessante David ... quasi programmando! La tua idea mi ha fatto riflettere, sto pubblicando la mia soluzione batch
SΛLVΘ

3
@SalvoF Esso è la programmazione. Batch ha variabili, goto, for, if, funzioni, macro ... cos'altro avete bisogno? ;)
DavidPostill

Non lo sapevo fino a quando non mi chiedevo cosa fosse successo alla mia configurazione di rete :-)
Thomas Weller,

@ThomasWeller Sai ancora come è successo?
DavidPostill

Non esattamente. Certamente è successo quando ho impostato le mie 2 linee DSL. Ho 2 modem DSL. Hanno gareggiato con DCHP, quindi ho impostato un indirizzo fisso. Ma quello usava solo un modem DSL, ignorando il secondo. Alcuni collage lo hanno fatto funzionare per 2 modem, potenzialmente impostando 2 indirizzi fissi. Da quel momento, alcuni dei miei file batch (e altre cose) non funzionano più come previsto. Da qui la domanda.
Thomas Weller,

6

Puoi usare questo rivestimento PS one:

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

Per usarlo direttamente dalla riga di comando:

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

o se si desidera riutilizzarlo, inserirlo in uno script e rendere l'indirizzo un parametro

Modifica: per ottenere un nome come mostra in Win / Ipconfig:

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

(l'assegnazione alle variabili intermedie è solo per renderla un po 'più leggibile)


Questo è bello e restituisce il nome HW. Sul mio sistema $powershellnon è definito, però, lancio quei comandi con powershell -cdal prompt dei comandi. Sulla riga di comando di PS viene eseguito anche il 1-liner.
SΛLVΘ

1
@ThomasWeller che in realtà è un nome della tua scheda di rete secondo la tua domanda. Ma fammi controllare, anche il nome logico dovrebbe essere ottenibile
wmz,

2
È su un altro tavolo @wmz. PS oscilla però: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 Controlla la mia modifica. È stato più duro di quanto pensassi! Fortunatamente PS supporta GetRelatedche facilita Associators ofun po 'i metodi.
wmz,

1
@SalvoF Sì, l'ho trovato
wmz

4

Sto cercando un comando inverso che visualizzi il nome della scheda di rete per un determinato indirizzo IP.

Sulla base di tutto ciò che ho provato, questo dovrebbe funzionare sembra che tu abbia bisogno di ottenere queste informazioni SOLO dall'indirizzo IP che hai già specificato nel tuo esempio.

PROMPT INTERATTIVO PER L'INDIRIZZO IP PER OTTENERE IL NOME CONNESSIONE RETE

(Utilizzare WMICe alcuni FORloop batch tokene delimanalisi per ottenere il nome della connessione di rete per un indirizzo IP specificato.)

(Il valore del risultato farà eco a una finestra di comando e una finestra di messaggio. È tutto uno script batch ma crea dinamicamente alcune funzioni di script VBS per semplificare il processo per chiunque ne abbia bisogno.)

@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

TUTTI I ONE-LINER

FINESTRE NATIVE SOLO CON NETSH TUTTE LE INTERFACCE (TUTTI GLI INDIRIZZI 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]*"

inserisci qui la descrizione dell'immagine

FINESTRE NATIVE SOLO CON IPCONFIG TUTTE LE INTERFACCE (TUTTI GLI INDIRIZZI IPv4)

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

inserisci qui la descrizione dell'immagine


USANDO PCRE2GREP (per @SalvoF)

INDIRIZZO IP UNICO SPECIFICATO

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

TROVA TUTTI GLI INDIRIZZI 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"

TROVA TUTTI GLI INDIRIZZI IP (Cleaned Up Regex (per @SalvoF))

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

Si noti che l' pcre2grepho provato è per @SalvoF [+1]come ha suggerito, ma usando .... FIND /Vper rimuovere la riga sopra contenente DHCPsembra ottenere l'output desiderato come descritto. Ho usato NETSHpiuttosto che IPCONFIGpure.


Questo cattura alcune informazioni extra sui miei computer (come maschere di rete e simili). Il mio punto era che nel caso in cui tu abbia più indirizzi IP, smetti di avere una regola "fissa" per arrivare al nome dell'interfaccia. La Q iniziale è: dato un IP n. come trovo l'interfaccia a cui appartiene? Non stavo cercando tutti gli IP.
SΛLVΘ

2
Grazie per i tuoi input! A proposito, ho notato che le linee iniziali e finali dalla mia parte erano dovute a problemi linguistici. Per aggirare quelli, cosa ne pensi di questo? netsh interface ip show config | pcre2grep "^[A-Z]|IP.*([0-9]{1,3}(\.|)){4}"(Ho pulito un po 'il regex). Sto imparando molto in questo posto!
SΛLVΘ

+1 Grazie per il suggerimento. Ha ancora troppi output per il mio utilizzo.
Thomas Weller,

3

Per essere più accurati, seguendo l'esempio di OP, userei sed, che si trova nella \usr\local\wbincartella di questo file zippato (progetto UnxUtils).

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

-nsopprime le linee non corrispondenti; il primo modello trova una riga che inizia con la lettera maiuscola, quindi la hmette nello spazio di attesa; la seconda corrispondenza è sul numero IP desiderato: a questo punto, viene richiamato il nome dell'interfaccia di mantenimento della linea ( g), il testo principale in più viene rimosso ( s) e stampato ( p).


-B4quasi funziona, mi lascia solo con il prefisso "adattatore Ethernet", che non appartiene al nome dell'adattatore + 4 righe di output non correlate. Ma il messaggio è chiaro: trova uno strumento che lo fa :-)
Thomas Weller,

1
Potresti aggiornare il tuo post per mostrare ipconfigoutput non filtrato ? (Offusca o modifica i dati per la privacy)
SΛLVΘ

Ok, aggiunto. Sembra anche complicato gestire adattatori con più indirizzi.
Thomas Weller,

1
È geniale @PJMahoney. Ma quale sarebbe l'output con più indirizzi IP? Ho fatto uno sforzo per una soluzione generale usando sed; forse anche la tua soluzione può essere ottimizzata per raggiungere questo obiettivo.
SΛLVΘ

Quello sed funziona se ne aggiungo un altro| sed -rn "s/^.* adapter (.*):/\1/p"
Thomas Weller,

2

Solo per la cronaca, ecco un'altra soluzione batch, sfrutta l'espansione ritardata della %ERRORLEVEL%variabile di sistema:

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

Può essere invocato in questo modo: find_int.cmd 192.168.1.100


Hehe. Questa è una soluzione batch pura ordinata. Ben fatto;)
David Post

+1 L'output è molto vicino a ciò di cui ho bisogno. Grazie
Thomas Weller,

Ho modificato il sedone-liner, lasciando il nome dell'interfaccia come unico output. Naturalmente, puoi anche scrivere un semplice file batch per quello, passando l'IP n. come argomento ( %1).
SΛLVΘ

@ThomasWeller, sintonizzato anche questo. Saluti!
SΛLVΘ

1

Grazie per lo sforzo a tutti. Sembra che ci siano diversi ostacoli:

  • il numero di indirizzi IP assegnati a un adattatore
  • la lingua del sistema operativo

Tutta la -Bxroba e Regex sembra rompersi facilmente, quindi ho cercato su Google qualcosa che potevo implementare e ho escogitato il seguente programma C #, che prende l'indirizzo IP come parametro ( 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

Su Windows 10 Powershell, questo può essere ottenuto con quanto segue:

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

Questo darà un risultato come Wi-Fi.

Dove è possibile sostituire InterfaceAliasqualsiasi altra proprietà dell'oggetto.

Per ottenere tutte le proprietà, semplicemente omettere i tubi, ed eseguire: Get-NetIPAddress -IPAddress '192.168.2.4'.

Altre proprietà correlate alla scheda di rete (come Descrizione) possono di solito essere interrogate in base InterfaceAliaso InterfaceIndex, ad es .:

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

Che darà qualcosa come: Intel(R) Dual Band Wireless-AC 8265.

Ulteriori informazioni sui documenti: https://docs.microsoft.com/en-us/powershell/module/nettcpip/get-netipaddress?view=win10-ps

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.