Команда для пошуку мережевого інтерфейсу для IP


10

С ipconfig Можу показати список мережевих адаптерів та їх налаштування, наприклад, IP-адресу.

Я шукаю зворотну команду, яка відображає назву мережевого адаптера для даної IP-адреси.

Я спробував фільтрувати вихід ipconfig з командою, подібною до ipconfig | find "192.168.2.4" але потім ім'я адаптера відсутнє.

Мій вихід ipconfig є (складна частина здається, що тут є кілька адрес на одному адаптері):

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

Для даної локальної адреси або для того, щоб дізнатися, яку маршрутизацію використовує інтерфейс для досягнення певної віддаленої адреси?
Ben Voigt

@BenVoigt: це адреса, призначена для мережевого інтерфейсу, тому результат має бути лише одним адаптером. Якщо йдеться про маршрутизацію, результатом може бути багато адаптерів (потенційно з різними показниками).
Thomas Weller

Відповіді:


7

Як відобразити назву мережевого адаптера для вказаної IP-адреси?

Це рішення робить ні вимагати будь-яких зовнішніх команд ( pcre2grep, sedі т.д.).

Використовуйте наступний пакетний файл (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

Використання:

getname ipaddress

Приклад:

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

Подальше читання


Цікаво, що Давид ... майже програмує! Ваша ідея змусила мене подумати, я розміщував своє пакетне рішення
SΛLVΘ

1
@SalvoF It є програмування. Пакет має змінні, goto, for, if, функції, макроси ... що ще потрібно? ;)
DavidPostill

Це я не знав, доки не замислювався, що сталося з моєю конфігурацією мережі :-)
Thomas Weller

@ThomasWeller Чи знаєте ви ще як це відбулося?
DavidPostill

Не зовсім. Це, звичайно, сталося, коли я встановив 2 лінії DSL. У мене є 2 DSL модеми. Вони змагалися з DCHP, тому я встановив фіксовану адресу. Але це тільки один модем DSL, ігноруючи другий. Деякі колегії змусили працювати на 2 модеми, потенційно встановивши 2 фіксованих адреси. З того часу деякі з моїх пакетних файлів (і інших матеріалів) більше не працюють, як очікувалося. Звідси й питання.
Thomas Weller

6

Ви можете використовувати цей лайнер PS:

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

Щоб використовувати його безпосередньо з командного рядка:

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

або якщо ви хочете повторно використовувати його, вставте його в скрипт і зробіть адресу параметром

Редагувати: щоб отримати ім'я, як воно показано в Win / Ipconfig:

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

(призначення проміжних змінних лише для того, щоб зробити його трохи читабельнішим)


Це круто, і воно повертає ім'я HW. У моїй системі $powershell не визначено, але я запускаю ці команди з powershell -c з командного рядка. На командному рядку PS також запускається перший один лайнер.
SΛLVΘ

1
@ThomasWeller, який фактично є іменем вашого мережного адаптера під час запитання. Але дозвольте мені перевірити, що логічне ім'я має бути доступним
wmz

2
Це на іншій таблиці @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} }"
SΛLVΘ

1
@ThomasWeller Перевірте моє редагування. Це було складніше, ніж я думав! На щастя PS підтримує GetRelated що полегшує Associators of методів трохи.
wmz

1
@ SalvoF Yup я знайшов його
wmz

4

Я шукаю зворотну команду, яка відображає назву   мережевий адаптер для даної IP-адреси.

Виходячи з усього, що я спробував, це має спрацювати, здається, вам потрібно отримати цю інформацію ТІЛЬКИ з IP-адреси, яку ви вже вказали у вашому прикладі.

ІНТЕРАКТИВНІ ПЕРЕДУМОВИ ДЛЯ АДРЕСА ІНС

(Використовуйте WMIC і деякі партії FOR петлі token і delim синтаксичний аналіз для отримання імені мережевого з'єднання для вказаної IP-адреси.)

(Значення результату відображатиметься в командному вікні та вікні вікна повідомлень. Це весь пакетний сценарій, але динамічно створює деякі функції скрипта VBS, щоб спростити процес для всіх, кому це потрібно.)

@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

ВСІ ОДНІ ЛІНЕРИ

NATIVE WINDOWS ТІЛЬКИ З ВСІМ ІНТЕРФЕЙСАМИ NETSH (ВСІ АДРЕСИ 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 ТІЛЬКИ З ІНТЕРФЕЙСОМ IPCONFIG (ВСІ АДРЕСИ 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


ВИКОРИСТАННЯ PCRE2GREP (за @SalvoF)

ВКАЗІВЛЯЄТЬСЯ ОДНОВА АДРЕСА IP

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

ЗНАЙТИ ВСІ АДРЕСИ 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"

ЗНАЙТИ ВСІ АДРЕСИ IP (очищена Regex (за @ SalvoF))

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

Зверніть увагу, що pcre2grep Я спробував на @ SalvoF [+1] як він запропонував, але використовуючи .... FIND /V щоб видалити рядок, що містить вище DHCP схоже, отримує бажаний вихід, як ви описали. я використав NETSH а не IPCONFIG так само.


Це вловлює додаткову інформацію про мої машини (як мережні маски, таке). Я маю на увазі, що у випадку, якщо у вас є кілька IP-адрес, ви перестаєте мати "фіксоване" правило, щоб дістатися до імені інтерфейсу. Початковий Q: задано IP-номер. як знайти інтерфейс, до якого він належить? Я не шукав усіх IP-адрес.
SΛLVΘ

1
Дякуємо за ваші внески! До речі, я помітив, що провідні та кінцеві лінії на моїй стороні пов'язані з мовними проблемами. Щоб обійти їх, що ви думаєте про це? netsh interface ip show config | pcre2grep "^[A-Z]|IP.*([0-9]{1,3}(\.|)){4}" (Я трохи очистив регулярний вираз). Я багато навчаюся навколо цього місця!
SΛLVΘ

+1 Дякуємо за пропозицію. Вона все ще має занадто багато результатів для мого використання.
Thomas Weller

3

Щоб бути більш точним, за прикладом ОП, я б використовував sed, які можна знайти в розділі \usr\local\wbin папки цей zip-файл (Проект UnxUtils).

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

-n пригнічує невідповідні лінії; Перший шаблон знаходить будь-яку лінію, починаючи з великої літери, потім h відкладає його на місце для утримання; Друге збіг на бажаному IP-адресі: на цьому етапі відкликається ім'я інтерфейсу, що тримається лінії ( g ), додатковий провідний текст знято ( s ) і надруковані ( p ).


-B4 Практично працює, він просто залишає мене з префіксом "Ethernet-адаптер", який не належить до назви адаптера + 4 рядки незв'язаного виводу. Але повідомлення ясне: знайдіть інструмент, який робить це :-)
Thomas Weller

1
Не могли б ви оновити свою публікацію, щоб показати нефільтровану ipconfig вихід? (Заплутати або змінити дані для конфіденційності)
SΛLVΘ

Добре, додав. Здається, також важко працювати з адаптерами з кількома адресами.
Thomas Weller

1
Це блискуче @PJMahoney. Який буде вихід з декількома IP-адресами? Я доклав зусиль для загального рішення за допомогою sed; можливо, ваше рішення теж можна змінити, щоб досягти цієї мети.
SΛLVΘ

Сед працює, якщо я додаю інший | sed -rn "s/^.* adapter (.*):/\1/p"
Thomas Weller

2

Тільки для запису, ось інше пакетне рішення, це експлуатує затримку розширення %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
    )
)

Його можна викликати таким чином: find_int.cmd 192.168.1.100


Хехе. Це акуратний чистий пакетний розчин. Добре зроблено;)
DavidPostill

+1 Вихід дуже близький до того, що мені потрібно. Дякую
Thomas Weller

Я редагував sed один лайнер, залишивши ім'я інтерфейсу як єдиний вихід. Звичайно, для цього можна написати простий пакетний файл, передавши IP-номер. як аргумент ( %1 ).
SΛLVΘ

@ThomasWeller, налаштував цю тему. Привітання!
SΛLVΘ

1

Дякуємо за всі зусилля. Здається, існує кілька перешкод:

  • кількість IP-адрес, призначених для адаптера
  • мовою ОС

Всі -Bx і Regex речі, здається, легко ламається, тому я googled для чого я міг реалізувати себе і придумав наступну програму C #, яка приймає IP-адресу як параметр ( 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);
                    }
                }
            }
        }
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.