web-dev-qa-db-fra.com

Commande pour trouver une interface réseau pour IP

Avec ipconfig, je peux afficher la liste des cartes réseau et leurs paramètres, par exemple. l'adresse IP.

Je recherche une commande inverse qui affiche le nom de la carte réseau pour une adresse IP donnée.

J'ai essayé de filtrer la sortie de ipconfig avec une commande telle que ipconfig | find "192.168.2.4", mais le nom de l'adaptateur est parti.

Ma sortie de ipconfig est (la partie la plus délicate semble avoir plusieurs adresses sur un seul adaptateur ici):

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:
...
11
Thomas Weller

Comment afficher le nom d'une carte réseau pour une adresse IP donnée?

Cette solution ne nécessite pas de commandes externes (pcre2grep, sed, etc.).

Utilisez le fichier de commandes suivant (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

Usage:

getname ipaddress

Exemple:

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

Lectures complémentaires

8
DavidPostill

Vous pouvez utiliser cette doublure PS one:

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

Pour l'utiliser directement en ligne de commande:

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

ou si vous voulez le réutiliser le mettre dans un script et faire de l'adresse un paramètre

Edit: pour obtenir un nom tel qu’il apparaît dans Win/Ipconfig:

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

(l'attribution à des variables intermédiaires ne sert qu'à le rendre un peu plus lisible)

6
wmz

Je recherche une commande inverse qui affiche le nom de la carte réseau pour une adresse IP donnée.

Sur la base de tout ce que j'ai essayé, cela devrait fonctionner, semble-t-il. Vous dites que vous devez obtenir ces informations UNIQUEMENT à partir de l'adresse IP que vous avez déjà spécifiée dans votre exemple.

Invite interactive pour l'adresse IP à obtenir le nom de connexion réseau

(Utilisez WMIC et des analyses de lot FOR en boucle token et delim pour obtenir le nom de la connexion réseau pour une adresse IP spécifiée.)

(La valeur du résultat sera renvoyée à une fenêtre de commande et à une fenêtre de message. Tout est un script batch, mais construit dynamiquement certaines fonctions de script VBS afin de simplifier le processus pour ceux qui en ont besoin.)

@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

TOUS LES ONE-LINERS

NATIVE WINDOWS UNIQUEMENT AVEC NETSHALL, TOUTES LES INTERFACES (TOUTES LES ADRESSES 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]*"

enter image description here

NATIVE WINDOWS UNIQUEMENT AVEC IPCONFIG, TOUTES LES INTERFACES (TOUTES LES ADRESSES IPv4)

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

enter image description here


UTILISATION DE PCRE2GREP (pour @SalvoF)

UNE SEULE ADRESSE IP SPÉCIFIÉE

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

TROUVER TOUTES LES ADRESSES 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"

TROUVER TOUTES LES ADRESSES IP (regex nettoyé (par @SalvoF))

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

Veuillez noter que le pcre2grep que j'ai essayé correspond à @SalvoF [+1] comme il l'a suggéré, mais que vous utilisez le .... FIND /V pour supprimer la ligne ci-dessus contenant DHCP, vous obtenez le résultat souhaité, comme vous l'avez décrit. J'ai aussi utilisé NETSH plutôt que IPCONFIG.

4
Pimp Juice IT

Pour être plus précis, suivant l'exemple d'OP, j'utiliserais sed, qui se trouve dans le dossier \usr\local\wbin de ce fichier compressé (projet UnxUtils).

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

-n supprime les lignes qui ne correspondent pas; le premier motif trouve une ligne commençant par une majuscule, puis h le met en attente; la deuxième correspondance est sur le numéro IP recherché: à ce stade, le nom d'interface titulaire de la ligne est rappelé (g), le texte principal supplémentaire est supprimé (s) et imprimé (p).

3
SΛLVΘ

Pour mémoire, voici une autre solution de traitement par lots, qui exploite l’extension retardée de la variable système %ERRORLEVEL%:

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

Il peut être appelé de cette façon: find_int.cmd 192.168.1.100

2
SΛLVΘ

Merci pour l'effort de tous. Il semble y avoir plusieurs obstacles:

  • le nombre d'adresses IP attribuées à un adaptateur
  • la langue de l'OS

Tous les éléments -Bx et Regex semblent se casser facilement, alors j'ai cherché quelque chose que je pouvais moi-même implémenter et j'ai créé le programme C # suivant, qui prend l'adresse IP comme paramètre (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);
                    }
                }
            }
        }
    }
}
1
Thomas Weller

Sur Windows 10 Powershell, cela peut être réalisé avec les éléments suivants:

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

Cela donnera un résultat tel que Wi-Fi.

Où Vous pouvez substituer InterfaceAlias à toute autre propriété d'objet.

Pour obtenir toutes les propriétés, omettez simplement les tuyaux et exécutez: Get-NetIPAddress -IPAddress '192.168.2.4'.

D'autres propriétés liées à la carte réseau (telles que Description) peuvent généralement être interrogées en fonction de InterfaceAlias ou InterfaceIndex, par exemple:

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

Ce qui donnera quelque chose comme: Intel(R) Dual Band Wireless-AC 8265.

En savoir plus sur la documentation: https://docs.Microsoft.com/en-us/powershell/module/nettcpip/get-netipaddress?view=win10-ps

0
MrMeszaros