Perintah untuk menemukan antarmuka jaringan untuk IP

12

Dengan ipconfigsaya dapat menunjukkan daftar adapter jaringan dan pengaturannya, misalnya alamat IP.

Saya mencari perintah sebaliknya yang menampilkan nama adaptor jaringan untuk alamat IP yang diberikan.

Saya telah mencoba memfilter keluaran ipconfigdengan perintah seperti ipconfig | find "192.168.2.4"tetapi kemudian nama adaptor hilang.

Output saya ipconfigadalah (bagian yang sulit tampaknya saya memiliki beberapa alamat pada satu adaptor di sini):

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:
...
Thomas Weller
sumber
Untuk alamat lokal tertentu, atau untuk mengetahui apa yang digunakan perutean antarmuka untuk mencapai alamat jarak jauh tertentu?
Ben Voigt
@ BenVoigt: ini adalah alamat yang ditetapkan untuk antarmuka jaringan, jadi hasilnya hanya satu adaptor saja. Jika itu tentang perutean, hasilnya bisa banyak adapter (berpotensi dengan metrik yang berbeda).
Thomas Weller

Jawaban:

8

Bagaimana cara menampilkan nama adaptor jaringan untuk alamat IP yang diberikan?

Solusi ini tidak tidak memerlukan perintah eksternal ( pcre2grep, sed, dll).

Gunakan file batch berikut (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

Pemakaian:

getname ipaddress

Contoh:

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

Bacaan lebih lanjut

DavidPostill
sumber
1
Itu menarik David ... hampir pemrograman! Ide Anda membuat saya berpikir, saya memposting solusi batch saya
SΛLVΘ
3
@SalvoF Ini adalah pemrograman. Batch memiliki variabel, goto, for, if, fungsi, macro ... apa lagi yang Anda perlu? ;)
DavidPostill
Saya tidak tahu ini sampai saya bertanya-tanya apa yang terjadi pada konfigurasi jaringan saya :-)
Thomas Weller
@ ThomasWeller Apakah Anda tahu bagaimana itu terjadi?
DavidPostill
Tidak persis. Itu pasti terjadi ketika saya mengatur 2 saluran DSL saya. Saya punya 2 modem DSL. Mereka berkompetisi dengan DCHP, jadi saya mengatur alamat tetap. Tapi itu hanya menggunakan satu modem DSL, mengabaikan yang kedua. Beberapa kolega membuatnya berfungsi untuk 2 modem, berpotensi dengan menetapkan 2 alamat tetap. Sejak saat itu, beberapa file batch saya (dan hal-hal lain) tidak berfungsi seperti yang diharapkan lagi. Karena itu pertanyaannya.
Thomas Weller
6

Anda bisa menggunakan PS one liner ini:

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

Untuk menggunakannya langsung dari baris perintah:

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

atau jika Anda ingin menggunakannya kembali, masukkan ke dalam skrip dan buat alamat sebagai parameter

Edit: untuk mendapatkan nama seperti yang ditunjukkan di Win / Ipconfig:

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

(penugasan ke variabel perantara hanya untuk membuatnya sedikit lebih mudah dibaca)

wmz
sumber
Ini keren, dan mengembalikan nama HW. Pada sistem saya $powershelltidak terdefinisi, saya meluncurkan perintah-perintah itu dengan powershell -cdari command prompt. Pada baris perintah PS 1st one-liner juga berjalan.
SΛLVΘ
1
@ ThomasWeller yang sebenarnya adalah nama adaptor jaringan Anda sesuai pertanyaan Anda. Tapi biar saya periksa, nama logis juga bisa didapat
wmz
2
Ada di meja @wmz. PS mengguncang: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 Periksa hasil edit saya. Itu lebih keras dari yang saya kira! Untungnya PS mendukung metode yang sedikit GetRelatedmemudahkan Associators of.
wmz
1
@SalvoF Yup, saya menemukannya
wmz
4

Saya mencari perintah sebaliknya yang menampilkan nama adaptor jaringan untuk alamat IP yang diberikan.

Berdasarkan semua yang saya coba, ini seharusnya bekerja sepertinya Anda mengatakan Anda perlu mendapatkan informasi ini HANYA dari alamat IP yang sudah Anda tentukan dalam contoh Anda.

PROMPT INTERAKTIF UNTUK ALAMAT IP UNTUK MENDAPATKAN NAMA KONEKSI JARINGAN

(Gunakan WMICdan beberapa bets FORlingkaran tokendan delimparsing untuk mendapatkan nama koneksi jaringan untuk alamat IP tertentu.)

(Nilai hasil akan bergema ke jendela perintah dan jendela kotak pesan. Itu semua skrip batch tetapi secara dinamis membangun beberapa fungsi skrip VBS untuk menyederhanakan proses bagi siapa pun yang membutuhkan.)

@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

SEMUA SATU-LINER

NATIVE WINDOWS HANYA DENGAN NETSH SEMUA INTERFACES (SEMUA ALAMAT 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]*"

masukkan deskripsi gambar di sini

WINDOWS NATIVE HANYA DENGAN IPCONFIG SEMUA INTERFACES (SEMUA ALAMAT IPv4)

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

masukkan deskripsi gambar di sini


MENGGUNAKAN PCRE2GREP (per @SalvoF)

ALAMAT IP TUNGGAL DITETAPKAN

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

CARI SEMUA ALAMAT 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"

CARI SEMUA ALAMAT IP (Cleaned Up Regex (per @SalvoF))

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

Harap dicatat bahwa pcre2grepsaya coba adalah per @SalvoF [+1]seperti yang dia sarankan tetapi menggunakan .... FIND /Vuntuk menghapus baris di atas yang mengandung DHCPtampaknya mendapatkan output yang diinginkan seperti yang Anda jelaskan. Saya menggunakan NETSHdaripada IPCONFIGjuga.

Pimp Juice
sumber
Ini menangkap beberapa informasi tambahan tentang mesin saya (seperti topeng jaringan, dan semacamnya). Maksud saya adalah jika Anda memiliki beberapa alamat IP, Anda berhenti memiliki aturan "tetap" untuk mendapatkan nama antarmuka. Q awal adalah: diberi IP no. bagaimana cara menemukan antarmuka miliknya? Saya tidak mencari semua IP.
SΛLVΘ
2
Terima kasih atas masukan Anda! BTW, saya perhatikan bahwa garis depan dan belakang di sisi saya disebabkan oleh masalah bahasa. Untuk menghindari itu, apa pendapat Anda tentang ini? netsh interface ip show config | pcre2grep "^[A-Z]|IP.*([0-9]{1,3}(\.|)){4}"(Saya membersihkan regex sedikit). Saya belajar banyak di tempat ini!
SΛLVΘ
+1 Terima kasih atas sarannya. Masih memiliki terlalu banyak output untuk penggunaan saya.
Thomas Weller
3

Untuk lebih akurat, mengikuti contoh OP, saya akan gunakan sed, yang dapat ditemukan di bawah \usr\local\wbinfolder file zip ini (proyek UnxUtils).

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

-nmenekan garis yang tidak cocok; pola pertama menemukan garis yang dimulai dengan huruf kapital, lalu hmenyimpannya di ruang yang ditunda; kecocokan kedua adalah pada nomor IP yang diinginkan: pada titik ini, nama antarmuka yang memegang garis dipanggil kembali ( g), teks utama tambahan dilucuti ( s), dan dicetak ( p).

SΛLVΘ
sumber
-B4hampir berfungsi, itu hanya membuat saya awalan "adapter Ethernet", yang bukan milik nama adaptor + 4 baris output yang tidak terkait. Tetapi pesannya jelas: temukan alat yang melakukannya :-)
Thomas Weller
1
Bisakah Anda memperbarui pos Anda untuk menampilkan ipconfigkeluaran tanpa filter ? (Mengaburkan atau mengubah data untuk privasi)
SΛLVΘ
Oke, tambah. Tampaknya juga sulit untuk menangani adaptor dengan banyak alamat.
Thomas Weller
1
@PJMahoney brilian. Apa yang akan menjadi output dengan beberapa alamat IP? Saya berusaha untuk solusi umum dengan menggunakan sed; mungkin solusi Anda juga dapat diubah untuk mencapai tujuan itu.
SΛLVΘ
Sed satu berfungsi jika saya menambahkan yang lain| sed -rn "s/^.* adapter (.*):/\1/p"
Thomas Weller
2

Sebagai catatan, inilah solusi batch lain, yang mengeksploitasi ekspansi %ERRORLEVEL%variabel sistem yang tertunda :

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

Ini dapat dipanggil dengan cara ini: find_int.cmd 192.168.1.100

SΛLVΘ
sumber
Hehe. Itu adalah solusi batch murni yang rapi. Bagus;)
DavidPostill
+1 Outputnya sangat dekat dengan yang saya butuhkan. Terima kasih
Thomas Weller
Saya mengedit sedone-liner, meninggalkan nama antarmuka sebagai output tunggal. Tentu saja, Anda dapat menulis file batch sederhana untuk itu juga, melewati IP no. sebagai argumen ( %1).
SΛLVΘ
@ ThomasWeller, lihat yang ini juga. Bersulang!
SΛLVΘ
1

Terima kasih atas upaya semua orang. Tampaknya ada beberapa rintangan:

  • jumlah alamat IP yang ditetapkan untuk adaptor
  • bahasa OS

Semua hal -Bx-hal dan Regex tampaknya mudah rusak, jadi saya mencari sesuatu yang bisa saya implementasikan sendiri di Google dan muncul dengan program C # berikut, yang menggunakan alamat IP sebagai parameter ( 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);
                    }
                }
            }
        }
    }
}
Thomas Weller
sumber
0

Pada Windows 10 Powershell, ini dapat dicapai dengan yang berikut:

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

Ini akan memberikan hasil seperti Wi-Fi.

Di mana Anda dapat menggantikan InterfaceAliasproperti objek lainnya.

Untuk mendapatkan semua properti, hanya menghilangkan pipa, dan jalankan: Get-NetIPAddress -IPAddress '192.168.2.4'.

Properti terkait adaptor jaringan lainnya (seperti Keterangan) biasanya dapat ditanyakan berdasarkan InterfaceAliasatau InterfaceIndex, misalnya .:

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

Yang akan memberikan sesuatu seperti: Intel(R) Dual Band Wireless-AC 8265.

Baca lebih lanjut tentang dokumen: https://docs.microsoft.com/en-us/powershell/module/nettcpip/get-netipaddress?view=win10-ps

MrMeszaros
sumber