Comando para encontrar a interface de rede para IP

12

Com ipconfigposso mostrar a lista de adaptadores de rede e suas configurações, por exemplo, o endereço IP.

Estou procurando um comando reverso que exibe o nome do adaptador de rede para um determinado endereço IP.

Eu tentei filtrar a saída de ipconfigcom um comando como, ipconfig | find "192.168.2.4"mas o nome do adaptador se foi.

Minha saída de ipconfigé (a parte complicada parece que tenho vários endereços em um adaptador aqui):

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
fonte
Para um determinado endereço local ou para descobrir qual roteamento de interface usa para alcançar um endereço remoto específico?
Ben Voigt
@BenVoigt: é um endereço atribuído a uma interface de rede, portanto o resultado deve ser apenas um adaptador. Se fosse sobre roteamento, o resultado poderia ser muitos adaptadores (potencialmente com métricas diferentes).
22615 Thomas Weller

Respostas:

8

Como exibir o nome de um adaptador de rede para um determinado endereço IP?

Esta solução é que não exige quaisquer comandos externos ( pcre2grep, sed, etc.).

Use o seguinte arquivo em 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

Exemplo:

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

Leitura adicional

DavidPostill
fonte
1
Isso é interessante, David ... quase programando! Sua idéia me fez pensar, estou postando a minha solução lote
SΛLVΘ
3
@SalvoF Ele está programando. Lote tem variáveis, goto, for, if, funções, macros ... o que mais você precisa? ;)
DavidPostill
Eu não sabia disso até eu me perguntava o que aconteceu com a minha configuração de rede :-)
Thomas Weller
@ThomasWeller Você já sabe como isso aconteceu?
DavidPostill
Não exatamente. Certamente aconteceu quando eu configurei minhas 2 linhas DSL. Eu tenho 2 modems DSL. Eles competiram com o DCHP, então eu configurei um endereço fixo. Mas isso usava apenas um modem DSL, ignorando o segundo. Alguns colegas fizeram o trabalho para 2 modems, possivelmente configurando 2 endereços fixos. Desde então, alguns dos meus arquivos em lotes (e outras coisas) não estão mais funcionando conforme o esperado. Daí a questão.
Thomas Weller
6

Você pode usar este liner PS one:

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

Para usá-lo diretamente da linha de comando:

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

ou se você quiser reutilizá-lo, coloque-o em um script e torne o endereço um parâmetro

Edit: para obter um nome como mostra em Win / Ipconfig:

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

(a atribuição a variáveis ​​intermediárias é apenas para torná-lo um pouco mais legível)

wmz
fonte
Isso é legal e retorna o nome HW. No $powershellentanto, no meu sistema não está definido, inicio esses comandos com o powershell -cprompt de comando. Na linha de comando PS, o primeiro liner também é executado.
SΛLVΘ
1
@ ThomasWeller, que de fato é o nome do seu adaptador de rede conforme sua pergunta. Mas deixe-me verificar, nome lógico deve ser obtida bem
wmz
2
Está em outra mesa @wmz. PS balança: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 Verifique minha edição. Isso foi mais difícil do que eu pensava! Felizmente, o PS suporta o GetRelatedque facilita Associators ofum pouco os métodos.
Wmz
1
@SalvoF Sim, eu encontrei
wmz
4

Estou procurando um comando reverso que exibe o nome do adaptador de rede para um determinado endereço IP.

Com base em tudo o que tentei, parece que você diz que precisa obter essas informações somente do endereço IP que você já especificou em seu exemplo.

PROMPT INTERATIVO PARA ENDEREÇO ​​IP PARA OBTER O NOME DA CONEXÃO DE REDE

(Use WMICe faça alguns FORciclos tokene delimanálises em lote para obter o nome da conexão de rede para um endereço IP especificado.)

(O valor do resultado ecoará em uma janela de comando e em uma janela de caixa de mensagem. É tudo script em lote, mas cria dinamicamente algumas funções de script VBS para simplificar o processo para qualquer pessoa que precise.)

@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

ALL ONE-LINERS

WINDOWS NATIVOS SOMENTE COM REDE TODAS AS INTERFACES (TODOS OS ENDEREÇOS 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]*"

insira a descrição da imagem aqui

WINDOWS NATIVOS SOMENTE COM IPCONFIG TODAS AS INTERFACES (TODOS OS ENDEREÇOS IPv4)

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

insira a descrição da imagem aqui


USANDO PCRE2GREP (por @SalvoF)

ENDEREÇO ​​IP ÚNICO ESPECIFICADO

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

ENCONTRE TODOS OS ENDEREÇOS 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"

ENCONTRE TODOS OS ENDEREÇOS IP (Regex limpo (por @SalvoF))

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

Observe que o que pcre2grepeu tentei é por @SalvoF, [+1]como ele sugeriu, mas usar o .... FIND /Vpara remover a linha acima contém DHCPo resultado desejado, conforme descrito. Eu usei NETSHe não IPCONFIGtambém.

Pimp Juice IT
fonte
Isso captura algumas informações extras em minhas máquinas (como máscaras de rede e outras). Meu argumento foi que, caso você tenha vários endereços IP, você deixa de ter uma regra "fixa" para obter o nome da interface. Q inicial é: dado um IP não. como localizo a interface a que pertence? Eu não estava procurando todos os IPs.
SΛLVΘ
2
Obrigado por suas contribuições! BTW, notei que as linhas iniciais e finais do meu lado se deviam a problemas de linguagem. Para contornar isso, o que você acha disso? netsh interface ip show config | pcre2grep "^[A-Z]|IP.*([0-9]{1,3}(\.|)){4}"(Limpei um pouco a regex). Estou aprendendo muito por esse lugar!
SΛLVΘ
+1 Obrigado pela sugestão. Ele ainda tem muita saída para o meu uso.
22416 Thomas Weller
3

Para ser mais preciso, seguindo o exemplo do OP, eu usaria sed, que pode ser encontrado na \usr\local\wbinpasta deste arquivo compactado (projeto UnxUtils).

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

-nsuprime linhas não correspondentes; o primeiro padrão encontra qualquer linha que comece com letra maiúscula e a hcoloca em espera; a segunda correspondência está no número IP desejado: nesse momento, o nome da interface de retenção de linha é chamado ( g), o texto inicial extra é retirado ( s) e impresso ( p).

SΛLVΘ
fonte
-B4quase funciona, apenas me deixa o prefixo "adaptador Ethernet", que não pertence ao nome do adaptador + 4 linhas de saída não relacionada. Mas a mensagem é clara: encontrar uma ferramenta que faz isso :-)
Thomas Weller
1
Você poderia atualizar sua postagem para mostrar ipconfigresultados não filtrados ? (Dados Ofuscação ou mudança de privacidade)
SΛLVΘ
Ok, acrescentou. Também parece ser complicado manipular adaptadores com vários endereços.
Thomas Weller
1
Isso é brilhante @PJMahoney. Qual seria a saída com vários endereços IP? Fiz um esforço para uma solução geral usando sed; talvez sua solução também possa ser aprimorada para atingir esse objetivo.
SΛLVΘ
O sed funciona se eu adicionar outro #| sed -rn "s/^.* adapter (.*):/\1/p"
Thomas Weller
2

Apenas para constar, aqui está outra solução em lote, que explora a expansão atrasada da %ERRORLEVEL%variável do 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
    )
)

Pode ser invocado desta maneira: find_int.cmd 192.168.1.100

SΛLVΘ
fonte
Ele Ele. Essa é uma solução pura de lote puro. Bem feito;)
DavidPostill
+1 A saída está muito próxima do que eu preciso. Obrigado
Thomas Weller
Eu editei o sedone-liner, deixando o nome da interface como saída única. Obviamente, você também pode escrever um arquivo em lotes simples, passando o número de IP. como argumento ( %1).
SΛLVΘ
@ThomasWeller, sintonizou este também. Felicidades!
SΛLVΘ
1

Obrigado pelo esforço de todos. Parece que existem vários obstáculos:

  • o número de endereços IP atribuídos a um adaptador
  • o idioma do sistema operacional

Todo o -Bxmaterial Regex parece quebrar facilmente, então procurei por algo que pudesse me implementar e criei o seguinte programa C #, que usa o endereço 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);
                    }
                }
            }
        }
    }
}
Thomas Weller
fonte
0

No Windows 10 Powershell, isso pode ser alcançado com o seguinte:

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

Isso dará um resultado como Wi-Fi.

Onde você pode substituir InterfaceAliasqualquer outra propriedade do objeto.

Para obter todas as propriedades, simplesmente omitir os tubos, e execute: Get-NetIPAddress -IPAddress '192.168.2.4'.

Propriedades relacionadas com outro adaptador de rede (tal como Descrição) normalmente podem ser consultados com base em InterfaceAliasou InterfaceIndex, por exemplo .:

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

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

Leia mais sobre os documentos: https://docs.microsoft.com/en-us/powershell/module/nettcpip/get-netipaddress?view=win10-ps

MrMeszaros
fonte