คำสั่งเพื่อค้นหาอินเตอร์เฟสเครือข่ายสำหรับ IP


11

ด้วย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: เป็นที่อยู่ที่กำหนดให้กับอินเทอร์เฟซเครือข่ายดังนั้นผลลัพธ์ควรเป็นหนึ่งอะแดปเตอร์เท่านั้น หากเกี่ยวกับการกำหนดเส้นทางผลลัพธ์อาจเป็นอะแดปเตอร์จำนวนมาก (อาจมีเมตริกที่แตกต่างกัน)
โธมัสเวลเลอร์

คำตอบ:


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>

อ่านเพิ่มเติม

  • ดัชนี AZ ของบรรทัดคำสั่ง Windows CMD - การอ้างอิงที่ยอดเยี่ยมสำหรับทุกสิ่งที่เกี่ยวข้องกับบรรทัด Windows cmd
  • for / f - คำสั่งวนซ้ำกับผลลัพธ์ของคำสั่งอื่น
  • ipconfig - กำหนดค่า IP (การกำหนดค่าอินเทอร์เน็ตโปรโตคอล)

1
นั่นเป็นเรื่องที่น่าสนใจเดวิด ... เกือบจะเขียนโปรแกรม! ความคิดของคุณทำให้ฉันคิดว่าฉันกำลังโพสต์โซลูชั่นชุดของฉัน
SΛLVΘ

2
@SalvoF มันคือการเขียนโปรแกรม Batch มีตัวแปรgoto, for, ifฟังก์ชั่นมาโคร ... สิ่งที่เพิ่มเติมที่คุณต้อง? ;)
DavidPostill

ผมไม่ทราบว่านี้จนผมสงสัยว่าสิ่งที่เกิดขึ้นกับการกำหนดค่าเครือข่าย :-) ของฉัน
โทมัสเวลเลอร์

@ThomasWeller คุณรู้ไหมว่ามันเกิดขึ้นได้อย่างไร?
DavidPostill

ไม่แน่นอน มันเกิดขึ้นอย่างแน่นอนเมื่อฉันติดตั้งสาย DSL 2 สายของฉัน ฉันมีโมเด็ม DSL 2 ตัว พวกเขาแข่งขันกับ 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 ลำดับที่หนึ่งซับเดียวทำงานเช่นกัน
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 ที่คุณระบุไว้ในตัวอย่างเท่านั้น

PROMPT แบบโต้ตอบสำหรับที่อยู่ IP เพื่อรับชื่อการเชื่อมต่อเครือข่าย

(ใช้WMICและบางชุดFORวนtokenและการdelimแยกเพื่อรับชื่อการเชื่อมต่อเครือข่ายสำหรับที่อยู่ IP ที่ระบุ)

(ค่าผลลัพธ์จะสะท้อนไปที่หน้าต่างคำสั่งและหน้าต่างกล่องข้อความมันเป็นสคริปต์ชุดงานทั้งหมด แต่สร้างฟังก์ชัน VBS script แบบไดนามิกเพื่อให้กระบวนการสำหรับผู้ที่ต้องการง่ายขึ้น)

@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]*"

ป้อนคำอธิบายรูปภาพที่นี่

Windows พื้นเมืองเท่านั้นกับ 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 ทั้งหมด (ล้าง 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Θ

2
ขอบคุณสำหรับอินพุตของคุณ! BTW ฉันสังเกตเห็นว่าเส้นนำและต่อท้ายด้านข้างของฉันเกิดจากปัญหาทางภาษา คุณคิดอย่างไรเกี่ยวกับเรื่องนี้? netsh interface ip show config | pcre2grep "^[A-Z]|IP.*([0-9]{1,3}(\.|)){4}"(ฉันทำความสะอาด regex เล็กน้อย) ฉันเรียนรู้มากเกี่ยวกับสถานที่นี้!
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เกือบจะใช้งานได้เพียงทิ้งฉันไว้กับคำนำหน้า "อีเทอร์เน็ตอะแดปเตอร์" ซึ่งไม่ได้เป็นของชื่ออะแดปเตอร์ + 4 บรรทัดของเอาต์พุตที่ไม่เกี่ยวข้อง แต่ข้อความที่มีความชัดเจน: หาเครื่องมือที่ไม่ได้ :-)
โทมัสเวลเลอร์

1
คุณสามารถอัปเดตโพสต์ของคุณเพื่อแสดงipconfigผลลัพธ์ที่ไม่มีการกรองได้หรือไม่ (ทำให้งงงวยหรือเปลี่ยนแปลงข้อมูลเพื่อความเป็นส่วนตัว)
SΛLVΘ

ตกลงเพิ่ม ดูเหมือนว่าจะยุ่งยากในการจัดการกับอะแดปเตอร์ที่มีหลายที่อยู่
โทมัสเวลเลอร์

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 ดูเหมือนจะแตกง่ายดังนั้นฉันจึงไปหาสิ่งที่ฉันสามารถนำไปใช้เองและมากับโปรแกรม 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หรือ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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.