Команда для поиска сетевого интерфейса для IP


12

С его помощью 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:
...

Для данного локального адреса, или чтобы узнать, какой интерфейс использует маршрутизация для достижения определенного удаленного адреса?
Бен Фойгт

@BenVoigt: это адрес, назначенный сетевому интерфейсу, поэтому результатом должен быть только один адаптер. Если бы речь шла о маршрутизации, результатом могло бы быть множество адаптеров (возможно, с разными метриками).
Томас Веллер

Ответы:


8

Как отобразить имя сетевого адаптера для данного 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>

Дальнейшее чтение


1
Это интересно, Дэвид ... почти программирование! Ваша идея заставила меня задуматься, я
публикую

3
@SalvoF It является программирование. Batch имеет переменные goto, for, if, функции, макросы ... Что еще нужно? ;)
ДэвидПостилл

Я не знал этого, пока не задумался, что случилось с моей сетевой конфигурацией :-)
Томас Веллер

@ThomasWeller Знаете ли вы, как это случилось?
DavidPostill

Не совсем. Это, конечно, произошло, когда я настроил 2 линии DSL. У меня 2 DSL модема. Они конкурировали с DCHP, поэтому я установил фиксированный адрес. Но тот использовал только один модем DSL, игнорируя второй. Некоторые коллеги заставили его работать для 2 модемов, возможно, установив 2 фиксированных адреса. С тех пор некоторые из моих командных файлов (и другие вещи) больше не работают, как ожидалось. Отсюда и вопрос.
Томас Веллер

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 также запускается 1-ая строка.
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 Да, я нашел это
wmz

4

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

Исходя из всего, что я пробовал, это должно работать, кажется, вы говорите, что вам нужно получить эту информацию ТОЛЬКО с 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

ВСЕ ОДНО-ЛИНЕРЫ

РОДНЫЕ ОКНА ТОЛЬКО С 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]*"

введите описание изображения здесь

РОДНЫЕ ОКНА ТОЛЬКО С IPCONFIG ВСЕМИ ИНТЕРФЕЙСАМИ (ВСЕ АДРЕСА IPv4)

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

введите описание изображения здесь


ИСПОЛЬЗОВАНИЕ 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-АДРЕСА (очищенное регулярное выражение (для @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Θ

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

+1 Спасибо за предложение. У меня все еще слишком много выходных данных для моего использования.
Томас Веллер

3

Чтобы быть более точным, я воспользуюсь примером OP sed, который можно найти в \usr\local\wbinпапке этого заархивированного файла (проект 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 строки несвязанного вывода. Но сообщение ясно: найдите инструмент, который делает это :-)
Томас Веллер

1
Не могли бы вы обновить свой пост, чтобы показать нефильтрованный ipconfigвывод? (Скрыть или изменить данные для конфиденциальности)
SΛLVΘ

Хорошо, добавил. Также кажется сложным работать с адаптерами с несколькими адресами.
Томас Уэллер

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

Сед один работает, если я добавлю другой| sed -rn "s/^.* adapter (.*):/\1/p"
Томас Уэллер

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 Выход очень близок к тому, что мне нужно. Спасибо
Томас Веллер

Я отредактировал sedоднострочник, оставив имя интерфейса в качестве единственного вывода. Конечно, вы можете написать простой пакетный файл для этого, передавая IP нет. в качестве аргумента ( %1).
SΛLVΘ

@ThomasWeller, тоже настроил это. Ура!
SΛLVΘ

1

Спасибо за усилия всем. Кажется, есть несколько препятствий:

  • количество IP-адресов, назначенных адаптеру
  • язык ОС

-BxКажется, что все и Regex легко ломаются, поэтому я нашел что-то, что мог бы реализовать сам, и придумал следующую программу на 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);
                    }
                }
            }
        }
    }
}

0

В Windows 10 Powershell это может быть достигнуто с помощью следующего:

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

Это даст такой результат, как Wi-Fi.

Где Вы можете заменить InterfaceAliasлюбое другое свойство объекта.

Для того, чтобы получить все свойства, просто опустить трубы и выполнить команду: Get-NetIPAddress -IPAddress '192.168.2.4'.

Другие свойства, относящиеся к сетевому адаптеру (например, Description), обычно могут запрашиваться на основе InterfaceAliasили InterfaceIndex, например:

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

Что даст что - то вроде: Intel(R) Dual Band Wireless-AC 8265.

Подробнее читайте в документации: https://docs.microsoft.com/en-us/powershell/module/nettcpip/get-netipaddress?view=win10-ps

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.