Comando para encontrar la interfaz de red para IP


12

Con ipconfigPuedo mostrar la lista de adaptadores de red y sus configuraciones, por ejemplo, la dirección IP.

Estoy buscando un comando inverso que muestre el nombre del adaptador de red para una dirección IP determinada.

He intentado filtrar la salida de ipconfigcon un comando como ipconfig | find "192.168.2.4"pero luego el nombre del adaptador desapareció.

Mi salida de ipconfiges (la parte difícil parece que tengo varias direcciones en un adaptador aquí):

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

¿Para una dirección local determinada o para averiguar qué interfaz utiliza el enrutamiento para llegar a una dirección remota en particular?
Ben Voigt

@BenVoigt: es una dirección asignada a una interfaz de red, por lo que el resultado debería ser un solo adaptador. Si se tratara de enrutamiento, el resultado podría ser muchos adaptadores (potencialmente con diferentes métricas).
Thomas Weller

Respuestas:


8

¿Cómo visualizo el nombre de un adaptador de red para una dirección IP dada?

Esta solución no requiere ninguna comandos externos ( pcre2grep, sed, etc.).

Utilice el siguiente archivo por lotes (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

Ejemplo:

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

Otras lecturas


1
Eso es interesante David ... ¡casi programación! Su idea me hizo pensar, estoy publicando mi solución por lotes
SΛLVΘ

3
@SalvoF Se está programando. Lote tiene variables, goto, for, if, funciones, macros ... ¿qué más se puede pedir? ;)
DavidPostill

No supe esto hasta que me pregunté qué había pasado con mi configuración de red :-)
Thomas Weller

@ThomasWeller ¿Ya sabes cómo sucedió?
DavidPostill

No exactamente. Ciertamente sucedió cuando configuré mis 2 líneas DSL. Tengo 2 módems DSL. Competían con DCHP, así que configuré una dirección fija. Pero eso solo usaba un módem DSL, ignorando el segundo. Algunos colegios lo hicieron funcionar para 2 módems, potencialmente configurando 2 direcciones fijas. Desde entonces, algunos de mis archivos por lotes (y otras cosas) ya no funcionan como se esperaba. De ahí la pregunta.
Thomas Weller

6

Podrías usar este PS one liner:

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

Para usarlo directamente desde la línea de comando:

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

o si desea reutilizarlo, póngalo en un script y convierta la dirección en un parámetro

Editar: para obtener un nombre como se muestra en Win / Ipconfig:

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

(la asignación a variables intermedias es solo para que sea un poco más legible)


Esto es genial, y devuelve el nombre HW. Sin $powershellembargo, en mi sistema no está definido, ejecuto esos comandos powershell -cdesde el símbolo del sistema. En la línea de comando PS, la primera línea también se ejecuta.
SΛLVΘ

1
@ThomasWeller, que de hecho es un nombre de su adaptador de red según su pregunta. Pero déjenme verificar, el nombre lógico también debería estar disponible
wmz

2
Está en otra mesa @wmz. PS es powershell "$ip = '192.168.2.4';foreach($int in (gwmi Win32_NetworkAdapter)) {gwmi Win32_NetworkAdapterConfiguration -Filter """Index = $($int.index)""" | ? {$_.IPAddress -contains $ip} | % {$int.NetConnectionID} }"
genial

1
@ThomasWeller Comprueba mi edición. ¡Eso fue más duro de lo que pensaba! Afortunadamente, PS admite lo GetRelatedque facilita Associators ofun poco los métodos.
wmz

1
@SalvoF Sí, lo encontré
wmz

4

Estoy buscando un comando inverso que muestre el nombre del adaptador de red para una dirección IP determinada.

Según todo lo que probé, esto debería funcionar, parece que usted dice que necesita obtener esta información SOLO de la dirección IP que ya especificó en su ejemplo.

PROPUESTA INTERACTIVA PARA DIRECCIÓN IP PARA OBTENER NOMBRE DE CONEXIÓN DE RED

(Use un WMICpoco de FORbucle por lotes tokeny delimanálisis para obtener el nombre de conexión de red para una dirección IP especificada).

(El valor del resultado se reflejará en una ventana de comando y una ventana de cuadro de mensaje. Es todo un script por lotes, pero crea dinámicamente algunas funciones de script VBS para simplificar el proceso para cualquier persona que lo necesite).

@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

TODOS UN LÍNEA

VENTANAS NATIVAS SOLO CON NETSH TODAS LAS INTERFACES (TODAS LAS DIRECCIONES 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]*"

ingrese la descripción de la imagen aquí

VENTANAS NATIVAS SOLO CON IPCONFIG TODAS LAS INTERFACES (TODAS LAS DIRECCIONES IPv4)

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

ingrese la descripción de la imagen aquí


UTILIZANDO PCRE2GREP (por @SalvoF)

DIRECCIÓN IP SIMPLE ESPECIFICADA

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

ENCUENTRE TODAS LAS DIRECCIONES 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"

ENCUENTRE TODAS LAS DIRECCIONES IP (Regex limpiado (por @SalvoF))

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

Tenga en cuenta que lo pcre2grepque probé es según @SalvoF [+1]como sugirió, pero el uso de ... FIND /Vpara eliminar la línea anterior que contiene DHCPparece obtener el resultado deseado como usted describió. Utilicé en NETSHlugar de IPCONFIGtambién.


Esto captura información adicional sobre mis máquinas (como máscaras de red, etc.). Mi punto es que en caso de que tenga varias direcciones IP, deja de tener una regla "fija" para acceder al nombre de la interfaz. Q inicial es: dado un IP no. ¿Cómo encuentro la interfaz a la que pertenece? No estaba buscando todas las IP.
SΛLVΘ

2
Gracias por tus aportes! Por cierto, noté que las líneas iniciales y finales de mi lado se debían a problemas de idioma. Para evitarlos, ¿qué piensas sobre esto? netsh interface ip show config | pcre2grep "^[A-Z]|IP.*([0-9]{1,3}(\.|)){4}"(Limpié un poco la expresión regular). ¡Estoy aprendiendo mucho por este lugar!
SΛLVΘ

+1 Gracias por la sugerencia. Todavía tiene demasiada salida para mi uso.
Thomas Weller

3

Para ser más exactos, siguiendo el ejemplo de OP, usaría sed, que se puede encontrar en la \usr\local\wbincarpeta de este archivo comprimido (proyecto UnxUtils).

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

-nsuprime las líneas no coincidentes; el primer patrón encuentra cualquier línea que comience con mayúscula, luego la hguarda en el espacio de espera; la segunda coincidencia está en el número de IP deseado: en este punto, se recupera el nombre de la interfaz de retención de línea ( g), se elimina el texto inicial adicional ( s) y se imprime ( p).


-B4casi funciona, solo me deja con el prefijo "adaptador Ethernet", que no pertenece al nombre del adaptador + 4 líneas de salida no relacionada. Pero el mensaje es claro: encuentre una herramienta que lo haga :-)
Thomas Weller

1
¿Podría actualizar su publicación para mostrar la ipconfigsalida sin filtrar ? (Ofuscar o cambiar los datos para la privacidad)
SΛLVΘ

Ok, agregado. También parece ser complicado manejar adaptadores con múltiples direcciones.
Thomas Weller

1
Eso es brillante @PJMahoney. ¿Cuál sería la salida con múltiples direcciones IP? Hice un esfuerzo para encontrar una solución general usando sed; quizás tu solución también se pueda ajustar para alcanzar ese objetivo.
SΛLVΘ

El sed funciona si agrego otro| sed -rn "s/^.* adapter (.*):/\1/p"
Thomas Weller

2

Solo para el registro, aquí hay otra solución por lotes, explota la expansión retardada de la %ERRORLEVEL%variable del 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
    )
)

Se puede invocar de esta manera: find_int.cmd 192.168.1.100


Jeje. Esa es una solución de lote puro puro. Bien hecho;)
DavidPostill

+1 La salida está muy cerca de lo que necesito. Gracias
Thomas Weller

Edité el sedone-liner, dejando el nombre de la interfaz como único resultado. Por supuesto, también puede escribir un archivo por lotes simple para eso, pasando el número de IP. como argumento ( %1).
SΛLVΘ

@ThomasWeller, sintonizó este también. ¡Salud!
SΛLVΘ

1

Gracias por el esfuerzo a todos. Parece que hay varios obstáculos:

  • El número de direcciones IP asignadas a un adaptador
  • el lenguaje del sistema operativo

Todo lo relacionado con -BxRegex parece romperse fácilmente, así que busqué en Google algo que pudiera implementar yo mismo y se me ocurrió el siguiente programa C #, que toma la dirección IP como parámetro ( 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

En Windows 10 Powershell, esto se puede lograr con lo siguiente:

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

Esto dará un resultado como Wi-Fi.

Donde puede sustituir InterfaceAliascualquier otra propiedad de objeto.

Para obtener todas las propiedades, simplemente omitir los tubos, y ejecute: Get-NetIPAddress -IPAddress '192.168.2.4'.

Las propiedades relacionadas otro adaptador de red (tales como la descripción) por lo general se pueden consultar basan en InterfaceAliaso InterfaceIndex, por ejemplo .:

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

Lo que dará algo como: Intel(R) Dual Band Wireless-AC 8265.

Lea más sobre los documentos: https://docs.microsoft.com/en-us/powershell/module/nettcpip/get-netipaddress?view=win10-ps

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.