Lệnh tìm giao diện mạng cho IP


12

Với ipconfigtôi có thể hiển thị danh sách các bộ điều hợp mạng và cài đặt của chúng, ví dụ địa chỉ IP.

Tôi đang tìm kiếm một lệnh đảo ngược hiển thị tên của bộ điều hợp mạng cho một địa chỉ IP nhất định.

Tôi đã thử lọc đầu ra của ipconfigmột lệnh như thế ipconfig | find "192.168.2.4"nhưng sau đó tên bộ điều hợp không còn nữa.

Đầu ra của tôi ipconfiglà (phần khó khăn dường như tôi có một vài địa chỉ trên một bộ chuyển đổi ở đây):

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

Đối với một địa chỉ cục bộ nhất định hoặc để tìm hiểu định tuyến giao diện nào sử dụng để tiếp cận một địa chỉ từ xa cụ thể?
Ben Voigt

@BenVoigt: đó là một địa chỉ được gán cho giao diện mạng, do đó, kết quả chỉ là một bộ điều hợp. Nếu đó là về định tuyến, kết quả có thể là nhiều bộ điều hợp (có khả năng với các số liệu khác nhau).
Thomas Weller

Câu trả lời:


8

Làm cách nào để hiển thị tên của bộ điều hợp mạng cho một địa chỉ IP nhất định?

Giải pháp này không đòi hỏi bất kỳ lệnh bên ngoài ( pcre2grep, sed, vv).

Sử dụng tệp bó sau (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

Sử dụng:

getname ipaddress

Thí dụ:

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

Đọc thêm


1
Thật thú vị David ... gần như lập trình! Ý tưởng của bạn khiến tôi suy nghĩ, tôi đang đăng giải pháp hàng loạt của mình
SΛLVΘ

3
@SalvoF Đó lập trình. Hàng loạt có các biến, goto, for, if, chức năng, macro ... nhiều hơn những gì bạn cần? ;)
DavidPostill

Tôi không biết điều này cho đến khi tôi tự hỏi điều gì đã xảy ra với cấu hình mạng của mình :-)
Thomas Weller

@ThomasWeller Bạn có biết nó đã xảy ra như thế nào không?
DavidPostill

Không chính xác. Nó chắc chắn đã xảy ra khi tôi thiết lập 2 đường DSL của mình. Tôi có 2 modem DSL. Họ cạnh tranh với DCHP, vì vậy tôi đã thiết lập một địa chỉ cố định. Nhưng điều đó chỉ sử dụng một modem DSL, bỏ qua cái thứ hai. Một số đồng nghiệp làm cho nó hoạt động cho 2 modem, có khả năng bằng cách đặt 2 địa chỉ cố định. Kể từ thời điểm đó, một số tệp bó của tôi (và các thứ khác) không hoạt động như mong đợi nữa. Do đó câu hỏi.
Thomas Weller

6

Bạn có thể sử dụng PS một lót này:

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

Để sử dụng nó trực tiếp từ dòng lệnh:

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

hoặc nếu bạn muốn sử dụng lại, hãy đặt nó vào tập lệnh và đặt địa chỉ làm tham số

Chỉnh sửa: để có được tên như trong Win / Ipconfig:

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

(việc gán cho các biến trung gian chỉ để làm cho nó dễ đọc hơn một chút)


Điều này thật tuyệt, và nó trả về tên CTNH. Trên hệ thống của tôi $powershellkhông được xác định mặc dù, tôi khởi chạy các lệnh đó với powershell -ctừ dấu nhắc lệnh. Trên dòng lệnh PS, 1st-liner cũng chạy.
SΛLVΘ

1
@ThomasWeller mà trên thực tế là tên của bộ điều hợp mạng theo câu hỏi của bạn. Nhưng hãy để tôi kiểm tra, tên logic cũng có thể đạt được
wmz

2
Nó ở trên bàn khác @wmz. PS đá mặc dù: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 Kiểm tra chỉnh sửa của tôi. Điều đó khó khăn hơn tôi nghĩ! May mắn thay, PS hỗ trợ GetRelatedgiúp giảm bớt Associators ofcác phương thức một chút.
wmz

1
@SalvoF Yup Tôi đã tìm thấy nó
wmz

4

Tôi đang tìm kiếm một lệnh đảo ngược hiển thị tên của bộ điều hợp mạng cho một địa chỉ IP nhất định.

Dựa trên tất cả mọi thứ tôi đã thử, điều này sẽ hoạt động có vẻ như bạn nói rằng bạn cần lấy thông tin này CHỈ từ địa chỉ IP mà bạn đã chỉ định trong ví dụ của mình.

KHUYẾN MÃI TƯƠNG TÁC CHO ĐỊA CHỈ IP ĐỂ NHẬN TÊN KẾT NỐI MẠNG

(Sử dụng WMICvà một số FORvòng lặp tokendelimphân tích cú pháp hàng loạt để lấy tên kết nối mạng cho một địa chỉ IP được chỉ định.)

(Giá trị kết quả sẽ lặp lại với cửa sổ lệnh và cửa sổ hộp thông báo. Đó là tất cả tập lệnh bó nhưng tự động xây dựng một số chức năng tập lệnh VBS để đơn giản hóa quy trình cho bất kỳ ai cần.)

@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

TẤT CẢ MỘT NGƯỜI

CỬA SỔ TỰ NHIÊN CHỈ VỚI NETSH TẤT CẢ CÁC INTERFACES (TẤT CẢ CÁC ĐỊA CHỈ 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]*"

nhập mô tả hình ảnh ở đây

CỬA SỔ TỰ NHIÊN CHỈ VỚI IPCONFIG TẤT CẢ CÁC INTERFACES (TẤT CẢ CÁC ĐỊA CHỈ IPv4)

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

nhập mô tả hình ảnh ở đây


SỬ DỤNG PCRE2GREP (mỗi @SalvoF)

ĐỊA CHỈ IP SINGLE

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

TÌM TẤT CẢ CÁC ĐỊA CHỈ 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"

TÌM TẤT CẢ CÁC ĐỊA CHỈ IP (Regex đã dọn sạch (mỗi @SalvoF))

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

Xin lưu ý rằng pcre2greptôi đã thử là theo @SalvoF [+1]như anh ấy đề xuất nhưng sử dụng .... FIND /Vđể xóa dòng ở trên có DHCPvẻ để có được đầu ra mong muốn như bạn mô tả. Tôi đã sử dụng NETSHchứ không phải IPCONFIGlà tốt.


Điều này nắm bắt một số thông tin bổ sung trên máy của tôi (như mặt nạ mạng, và như vậy). Quan điểm của tôi là trong trường hợp bạn có nhiều địa chỉ IP, bạn sẽ ngừng quy tắc "cố định" để lấy tên giao diện. Q ban đầu là: được cung cấp số IP. Làm thế nào để tôi tìm thấy giao diện nó thuộc về? Tôi đã không tìm kiếm tất cả IP.
SΛLVΘ

2
Cảm ơn bạn cho đầu vào của bạn! BTW, tôi nhận thấy rằng các dòng hàng đầu và dấu ở phía tôi là do vấn đề ngôn ngữ. Để phá vỡ những điều đó, bạn nghĩ gì về điều này? netsh interface ip show config | pcre2grep "^[A-Z]|IP.*([0-9]{1,3}(\.|)){4}"(Tôi đã làm sạch regex một chút). Tôi đang học hỏi rất nhiều ở nơi này!
SΛLVΘ

+1 Cảm ơn lời đề nghị. Nó vẫn có quá nhiều đầu ra cho việc sử dụng của tôi.
Thomas Weller

3

Để chính xác hơn, theo ví dụ của OP, tôi sẽ sử dụng sed, có thể tìm thấy trong \usr\local\wbinthư mục của tệp nén này (dự án UnxUtils).

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

-ntriệt tiêu các đường không khớp; mẫu đầu tiên tìm thấy bất kỳ dòng nào bắt đầu bằng chữ in hoa, sau đó hđặt nó ở chỗ trống; trận đấu thứ hai là số IP mong muốn: tại thời điểm này, tên giao diện giữ dòng được gọi lại ( g), thêm văn bản hàng đầu bị tước ( s) và in ( p).


-B4hầu như hoạt động, nó chỉ để lại cho tôi tiền tố "Bộ điều hợp Ethernet", không thuộc về tên bộ điều hợp + 4 dòng đầu ra không liên quan. Nhưng thông điệp rất rõ ràng: hãy tìm một công cụ thực hiện nó :-)
Thomas Weller

1
Bạn có thể cập nhật bài viết của mình để hiển thị ipconfigđầu ra chưa được lọc ? (Làm
xáo trộn

Ok, thêm vào. Nó cũng có vẻ khó khăn để xử lý các bộ điều hợp có nhiều địa chỉ.
Thomas Weller

1
Thật tuyệt vời @PJMahoney. Điều gì sẽ là đầu ra với nhiều địa chỉ IP mặc dù? Tôi đã nỗ lực cho một giải pháp chung bằng cách sử dụng sed; có lẽ giải pháp của bạn cũng có thể được điều chỉnh để đạt được mục tiêu đó.
SΛLVΘ

Chiếc sed hoạt động nếu tôi thêm cái khác| sed -rn "s/^.* adapter (.*):/\1/p"
Thomas Weller

2

Chỉ để ghi lại, đây là một giải pháp hàng loạt khác, nó khai thác sự mở rộng chậm trễ của %ERRORLEVEL%biến hệ thống:

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

Nó có thể được gọi theo cách này: find_int.cmd 192.168.1.100


Hehe. Đó là một giải pháp hàng loạt tinh khiết gọn gàng. Làm tốt lắm;)
DavidPostill

+1 Đầu ra rất gần với những gì tôi cần. Cảm ơn
Thomas Weller

Tôi đã chỉnh sửa sedmột lớp lót, để lại tên giao diện là đầu ra duy nhất. Tất nhiên, bạn cũng có thể viết một tệp bó đơn giản cho việc đó, vượt qua IP không. như đối số ( %1).
SΛLVΘ

@ThomasWeller, điều chỉnh cái này quá. Chúc mừng!
SΛLVΘ

1

Cảm ơn mọi người đã nỗ lực. Có vẻ như có một số trở ngại:

  • số lượng địa chỉ IP được gán cho bộ điều hợp
  • ngôn ngữ của hệ điều hành

Tất cả các -Bxcông cụ và Regex dường như dễ dàng bị phá vỡ, vì vậy tôi đã tìm kiếm thứ gì đó tôi có thể tự thực hiện và đưa ra chương trình C # sau, lấy địa chỉ IP làm tham số ( 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

Trên Windows 10 Powershell, điều này có thể đạt được bằng cách sau:

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

Điều này sẽ cho một kết quả như Wi-Fi.

Nơi bạn có thể thay thế InterfaceAliascho bất kỳ tài sản đối tượng khác.

Để có được tất cả các thuộc tính, chỉ cần bỏ qua các đường ống và chạy : Get-NetIPAddress -IPAddress '192.168.2.4'.

Các thuộc tính liên quan đến bộ điều hợp mạng khác (như Mô tả) thường có thể được truy vấn dựa trên InterfaceAliashoặc InterfaceIndex, ví dụ:

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

Mà sẽ cho một cái gì đó như : Intel(R) Dual Band Wireless-AC 8265.

Đọc thêm về các tài liệu: https://docs.microsoft.com/en-us/powershell/module/nettcpip/get-netipaddress?view=win10-ps

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.