查找IP网络接口的命令


13

使用“ 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 2015年

@BenVoigt:这是分配给网络接口的地址,因此结果应仅为一个适配器。如果是关于路由,则结果可能是许多适配器(可能具有不同的度量标准)。
托马斯·韦勒2015年

Answers:


8

如何显示给定IP地址的网络适配器名称?

这种解决方案要求任何外部命令(pcre2grepsed等)。

使用以下批处理文件(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
大卫,这很有趣……几乎是编程!你的想法让我觉得,我张贴我的批处理的解决方案
SΛLVΘ

3
@SalvoF 正在编程。一批有变量,gotoforif,函数,宏...更重要的是你需要什么?;)
DavidPostill

我不知道这一点,直到我想知道我的网络配置发生了什么:-)
Thomas Weller 2015年

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

(对中间变量的赋值只是为了使其更具可读性)


这很酷,它返回硬件名称。在我的系统$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是的,我找到了它
wmz

4

我正在寻找一个反向命令,该命令显示给定IP地址的网络适配器的名称。

基于我尝试过的所有内容,这似乎可以正常工作,您似乎只需要从示例中已指定的IP地址获取此信息即可。

IP地址交互提示以获取网络连接名称

(使用WMIC和一些批处理FOR循环tokendelim解析来获取指定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

所有单行

原生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]*"

在此处输入图片说明

仅具有IPCONFIG所有接口(所有IPv4地址)的本地Windows

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我尝试[+1]按照他的建议按照@SalvoF进行操作,但是使用.... 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感谢您的建议。它仍然有太多的输出供我使用。
Thomas Weller

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几乎可以正常工作,只是给我留了前缀“以太网适配器”,它不属于适配器名称+ 4行无关输出。但是消息很明确:找到一个能做到的工具:-)
Thomas Weller

1
您可以更新帖子以显示未过滤的ipconfig输出吗?(隐私混淆或变化数据)
SΛLVΘ

好的,添加。处理具有多个地址的适配器似乎也很棘手。
Thomas Weller

1
@PJMahoney真是太好了。但是,具有多个IP地址的输出将是什么?我通过使用来寻求一个通用的解决方案sed;也许您的解决方案也可以进行调整以实现该目标。
SΛLVΘ

如果我添加另一个,sed的作品就可以了| 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地址数量
  • 操作系统的语言

所有-Bxand 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'

通常可以基于InterfaceAlias或查询其他与网络适配器相关的属性(例如Description)InterfaceIndex,例如:

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

会得到类似:的信息Intel(R) Dual Band Wireless-AC 8265

在文档上阅读更多信息:https : //docs.microsoft.com/zh-cn/powershell/module/nettcpip/get-netipaddress? view = win10- ps

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.