Commande pour trouver l'interface réseau pour IP

12

Avec ipconfigje peux afficher la liste des adaptateurs 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 ipconfigavec une commande comme ipconfig | find "192.168.2.4"mais le nom de l'adaptateur a disparu.

Ma sortie ipconfigest (la partie délicate semble que j'ai plusieurs adresses sur un 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:
...
Thomas Weller
la source
Pour une adresse locale donnée ou pour savoir quelle interface utilise le routage pour atteindre une adresse distante particulière?
Ben Voigt
@BenVoigt: c'est une adresse affectée à une interface réseau, donc le résultat doit être un seul adaptateur. S'il s'agissait de routage, le résultat pourrait être de nombreux adaptateurs (potentiellement avec des métriques différentes).
Thomas Weller

Réponses:

8

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

Cette solution ne pas exiger des 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

DavidPostill
la source
1
C'est intéressant David ... presque de la programmation! Votre idée m'a fait réfléchir, je poste ma solution batch
SΛLVΘ
3
@SalvoF Il est la programmation. Lot a des variables, goto, for, if, fonctions, macros ... Que avez - vous besoin? ;)
DavidPostill
Je ne savais pas cela jusqu'à ce que je me demande ce qui est arrivé à ma configuration réseau :-)
Thomas Weller
@ThomasWeller Savez-vous encore comment cela s'est produit?
DavidPostill
Pas exactement. C'est certainement arrivé lorsque j'ai configuré mes 2 lignes DSL. J'ai 2 modems DSL. Ils étaient en concurrence avec DCHP, j'ai donc mis en place une adresse fixe. Mais cela n'utilisait qu'un seul modem DSL, ignorant le second. Certains collègues l'ont fait fonctionner pour 2 modems, potentiellement en définissant 2 adresses fixes. Depuis ce temps, certains de mes fichiers batch (et autres) ne fonctionnent plus comme prévu. D'où la question.
Weller Thomas
6

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 depuis la 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'affectation à des variables intermédiaires ne fait que le rendre un peu plus lisible)

wmz
la source
C'est cool, et cela renvoie le nom HW. Sur mon système $powershelln'est pas défini cependant, je lance ces commandes avec l' powershell -cinvite de commande. Sur la ligne de commande PS, la 1ère ligne fonctionne également.
SΛLVΘ
1
@ThomasWeller qui est en fait un nom de votre adaptateur réseau selon votre question. Mais permettez-moi de vérifier, le nom logique devrait également être disponible
wmz
2
C'est sur une autre table @wmz. PS powershell "$ip = '192.168.2.4';foreach($int in (gwmi Win32_NetworkAdapter)) {gwmi Win32_NetworkAdapterConfiguration -Filter """Index = $($int.index)""" | ? {$_.IPAddress -contains $ip} | % {$int.NetConnectionID} }"
rock
1
@ThomasWeller Vérifiez ma modification. C'était plus difficile que je ne le pensais! Heureusement, PS prend en charge GetRelatedce qui facilite Associators ofun peu les méthodes.
wmz
1
@SalvoF Yup je l'ai trouvé
wmz
4

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, vous semblez avoir besoin d'obtenir ces informations UNIQUEMENT à partir de l'adresse IP que vous avez déjà spécifiée dans votre exemple.

DEMANDE INTERACTIVE D'ADRESSE IP POUR OBTENIR UN NOM DE CONNEXION RÉSEAU

(Utilisez WMICet une FORboucle tokenet une delimanalyse par lots pour obtenir le nom de la connexion réseau pour une adresse IP spécifiée.)

(La valeur de résultat se répercutera dans une fenêtre de commande et une fenêtre de boîte de message. Ce sont tous des scripts batch mais créent dynamiquement certaines fonctions de script VBS pour simplifier le processus pour quiconque en a 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

FENÊTRES AUTOCHTONES UNIQUEMENT AVEC NETSH 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]*"

entrez la description de l'image ici

FENÊTRES NATIVES 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]*"

entrez la description de l'image ici


UTILISATION DE PCRE2GREP (par @SalvoF)

ADRESSE IP UNIQUE SPÉCIFIÉE

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

TROUVEZ 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"

TROUVEZ TOUTES LES ADRESSES IP (Cleaned Up Regex (per @SalvoF))

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

Veuillez noter que pcre2grepj'ai essayé est par @SalvoF [+1]comme il l'a suggéré mais en utilisant le .... FIND /Vpour supprimer la ligne ci-dessus contenant DHCPsemble obtenir la sortie souhaitée comme vous l'avez décrit. J'ai utilisé NETSHplutôt que IPCONFIGbien.

Pimp Juice IT
la source
Cela attrape des informations supplémentaires sur mes machines (comme les masques de réseau, etc.). Mon point était que dans le cas où vous avez plusieurs adresses IP, vous cessez d'avoir une règle "fixe" pour accéder au nom de l'interface. Le Q initial est: étant donné un IP no. comment trouver l'interface à laquelle il appartient? Je ne cherchais pas tous les IP.
SΛLVΘ
2
Merci pour vos contributions! BTW, j'ai remarqué que les lignes de début et de fin de mon côté étaient dues à des problèmes de langue. Pour les contourner, qu'en pensez-vous? netsh interface ip show config | pcre2grep "^[A-Z]|IP.*([0-9]{1,3}(\.|)){4}"(J'ai nettoyé un peu l'expression régulière). J'apprends beaucoup autour de cet endroit!
SΛLVΘ
+1 Merci pour la suggestion. Il a encore trop de sortie pour mon usage.
Thomas Weller
3

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

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

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

SΛLVΘ
la source
-B4fonctionne presque, il me laisse juste le préfixe "adaptateur Ethernet", qui n'appartient pas au nom de l'adaptateur + 4 lignes de sortie sans rapport. Mais le message est clair: trouvez un outil qui le fait :-)
Thomas Weller
1
Pourriez-vous mettre à jour votre message pour afficher une ipconfigsortie non filtrée ? (Obscurcir ou modifier les données pour la confidentialité)
SΛLVΘ
Ok, ajouté. Il semble également difficile de gérer les adaptateurs avec plusieurs adresses.
Thomas Weller
1
C'est génial @PJMahoney. Quelle serait la sortie avec plusieurs adresses IP? J'ai fait un effort pour une solution générale en utilisant sed; peut-être que votre solution peut également être modifiée pour atteindre cet objectif.
SΛLVΘ
Le sed fonctionne si j'en ajoute un autre| sed -rn "s/^.* adapter (.*):/\1/p"
Thomas Weller
2

Juste pour mémoire, voici une autre solution batch, elle exploite l'expansion retardée de la %ERRORLEVEL%variable système:

@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 invoqué de cette façon: find_int.cmd 192.168.1.100

SΛLVΘ
la source
Hehe. C'est une solution pure et simple par lots. Bravo;)
DavidPostill
+1 La sortie est très proche de ce dont j'ai besoin. Merci
Thomas Weller
J'ai édité le sedone-liner, laissant le nom de l'interface comme seule sortie. Bien sûr, vous pouvez également écrire un fichier batch simple en passant l'IP no. comme argument ( %1).
SΛLVΘ
@ThomasWeller, a réglé celui-ci aussi. À votre santé!
SΛLVΘ
1

Merci pour l'effort tout le monde. Il semble qu'il y ait plusieurs obstacles:

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

Tous les -Bxtrucs et Regex semblent se casser facilement, j'ai donc recherché quelque chose que je pourrais implémenter moi-même et j'ai proposé 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);
                    }
                }
            }
        }
    }
}
Thomas Weller
la source
0

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 remplacer InterfaceAliastoute 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 à l'adaptateur réseau (telles que la description) peuvent généralement être interrogées en fonction InterfaceAliasou InterfaceIndex, par exemple:

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

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

En savoir plus sur les documents: https://docs.microsoft.com/en-us/powershell/module/nettcpip/get-netipaddress?view=win10-ps

MrMeszaros
la source