Bagaimana menemukan layanan jaringan yang terhubung saat ini dari baris perintah?

20

Saya ingin mengetahui layanan jaringan yang tersedia (mis. Ethernet atau Wi-Fi ) yang saat ini aktif. Dalam tangkapan layar ini dari Network Preferences, Anda dapat melihat Wi-Fi itu saat ini aktif (titik hijau):

Preferensi Jaringan

Bagaimana saya bisa mendapatkan informasi itu dari baris perintah?

The networksetupperintah memungkinkan saya untuk daftar layanan jaringan yang tersedia:

$ networksetup -listallnetworkservices
An asterisk (*) denotes that a network service is disabled.
Ethernet
FireWire
Wi-Fi

Itu juga dapat menampilkan beberapa detail pada layanan, seperti nama perangkat:

$ networksetup -listnetworkserviceorder
An asterisk (*) denotes that a network service is disabled.
(1) Ethernet
(Hardware Port: Ethernet, Device: en0)

(2) FireWire
(Hardware Port: FireWire, Device: fw0)

(3) Wi-Fi
(Hardware Port: Wi-Fi, Device: en1)

Sayangnya, info layanan mana yang aktif (titik hijau dari tangkapan layar) tidak tersedia di info ini. Apakah ada perintah lain yang bisa saya gunakan untuk mendapatkan informasi ini?

nwinkler
sumber

Jawaban:

7

Cukup masalah

    ifconfig

Daftar semua antarmuka jaringan dan statusnya.

fd0
sumber
Benar - setiap catatan berisi statusbidang yang memiliki activeatau inactivesebagai nilai.
nwinkler
1
Ini akan memberi Anda hasil yang salah jika Anda membagikan internet Anda. Misalkan Anda berbagi internet ethernet melalui wifi maka status untuk Ethernet dan wifi akan "aktif"
Harshal Chaudhari
3
Ini tidak menunjukkan kepada Anda layanan mana yang sedang digunakan - wifi dan ethernet akan tampil 'aktif' jika Anda telah mengaktifkan dan kabel ethernet tersambung.
tog22
1
Ini cukup berguna untuk memeriksa apakah koneksi tidak terhubung. Misalnya ethernet saya umumnya hanya terhubung di tempat kerja. Jadi saya bisa menyimpulkan saya di rumah dengan ini tidak ada dalam daftar. ifconfig | grep $(networksetup -listnetworkserviceorder | grep 'Ethernet, Device' | sed -E "s/.*(en[0-9]).*/\1/"). Kemudian saya dapat beralih lokasi berdasarkan hal di atas kosong.
Chris Rymer
Ini hanya mencantumkan semua antarmuka jaringan bukan layanan jaringan.
algal
16

Gabungkan semuanya, saya menulis sebuah skrip untuk menyelesaikan tugas ini:

#!/bin/bash

services=$(networksetup -listnetworkserviceorder | grep 'Hardware Port')

while read line; do
    sname=$(echo $line | awk -F  "(, )|(: )|[)]" '{print $2}')
    sdev=$(echo $line | awk -F  "(, )|(: )|[)]" '{print $4}')
    #echo "Current service: $sname, $sdev, $currentservice"
    if [ -n "$sdev" ]; then
        ifout="$(ifconfig $sdev 2>/dev/null)"
        echo "$ifout" | grep 'status: active' > /dev/null 2>&1
        rc="$?"
        if [ "$rc" -eq 0 ]; then
            currentservice="$sname"
            currentdevice="$sdev"
            currentmac=$(echo "$ifout" | awk '/ether/{print $2}')

            # may have multiple active devices, so echo it here
            echo "$currentservice, $currentdevice, $currentmac"
        fi
    fi
done <<< "$(echo "$services")"

if [ -z "$currentservice" ]; then
    >&2 echo "Could not find current service"
    exit 1
fi

Script pertama mendapatkan daftar layanan dari networksetup perintah, lalu periksa apakah setiap layanan dalam status aktif dari ifconfig.

Beri nama skrip networkservice.shmisalnya, kemudian jalankan untuk mendapatkan layanan jaringan saat ini.

$ bash networkservice.sh
USB 10/100/1000 LAN, en4, 00:e0:4a:6b:4d:0c
Wi-Fi, en0, 8c:85:90:a0:4b:ec
Reorx
sumber
Saya harus menyalurkan saluran pertama ke tacuntuk beralih melalui antarmuka dalam urutan terbalik karena saya sering memiliki WiFi yang terhubung serta adaptor ethernet USB (yang merupakan perangkat yang disukai dalam Jaringan). Dalam hal ini saya ingin alat aktif yang paling disukai dicetak:services=$(networksetup -listnetworkserviceorder | grep 'Hardware Port' | tac)
ghr
@ Ghr itu tidak masuk akal, networksetup -listnetworkserviceordersudah menampilkan "perangkat yang paling disukai" pertama ...
Motsel
Sepertinya saya sedikit memodifikasi script di atas sehingga hanya mencetak 1 layanan, daripada yang terhubung. Saya harus melakukannya tacagar nanti (tidak disukai) layanan tidak akan menimpa $currentservice. Seharusnya lebih jelas dalam komentar asli itu.
ghr
5

Itu scutil --dns perintah memberikan semua informasi jaringan routing Anda harus memetakan label antarmuka perangkat keras untuk rute jaringan.

Sedikit awkdan grepdapat menyesuaikannya jika Anda perlu skrip informasi atau pare itu. Mulailah dengan mencengkeram "if_index" jika Anda penasaran.

bmike
sumber
Itu terlihat berguna - saya akan bermain-main dengan itu!
nwinkler
3

Hanya memetikan orang lain tersandung di ini seperti yang saya lakukan kode di bawah ini mungkin lebih dari apa yang Anda cari.

Ini untuk memperluas pada Jawaban PeterVP

Juga dapat dilihat di https://www.kittell.net/code/mac-os-x-get-network-information/

#! / bin / sh

bersih
sExternalMACALService = "http://dns.kittell.net/macaltext.php?address="

# Daftar semua port jaringan
NetworkPorts = $ (ifconfig -uv | grep '^ [a-z0-9]' | awk -F: '{print $ 1}')
#echo $ NetworkPorts

# Berfungsi untuk mengubah IP Subnet Mask ke CIDR
mask2cdr ()
{
# Diasumsikan tidak ada "255." setelah non-255 byte di mask
local x = $ {1 ## * 255.}
set - 0 ^^^ 128 ^ 192 ^ 224 ^ 240 ^ 248 ^ 252 ^ 254 ^ $ ((($ {# 1} - $ {# x}) * 2)) $ {x %%. *}
x = $ {1 %% $ 3 *}
echo $ (($ 2 + ($ {# x} / 4)))
}

# Dapatkan alamat IP jarak jauh / publik
remoteip = $ (gali + short myip.opendns.com @ resolver1.opendns.com)

# Dapatkan nama komputer
computername = $ (scutil --get ComputerName)

# Dapatkan nomor seri
sSerialNumber = $ (system_profiler SPHardwareDataType | grep "Nomor Seri (sistem)" | awk '{print $ 4}' | cut -d / -f1)
#echo $ sSerialNumber

# Dapatkan nama dan versi sistem operasi - Mulai
OSvers1 = $ (sw_vers -productVersion | cut -d. -F1)
OSvers2 = $ (sw_vers -productVersion | cut -d. -F2)
OSvers3 = $ (sw_vers -productVersion | cut -d. -F3)
case $ OSvers2 in
8)
OSName = "Singa Gunung"
;;
9)
OSName = "Mavericks"
;;
10)
OSName = "Yosemite"
;;
11)
OSName = "El Capitan"
;;
12)
OSName = "Sierra"
;;
default)
OSName = "Tidak Dikenal"
;;
esac
# Dapatkan nama dan versi sistem operasi - Stop


echo "$ computername"
gema "--------------"
echo "OS Komputer: Mac OS X - $ OSName $ OSvers1. $ OSvers2. $ OSvers3"
echo "Nama Komputer: $ computername"
echo "Nama Pengguna Saat Ini: $ (whoami)"
echo "Nomor Seri: $ sSerialNumber"

if [[$ remoteip]]; kemudian
echo "Remote IP Address: $ remoteip \ n"
lain
echo "Remote IP Address: Tidak Dapat Menentukan \ n"
fi

untuk val dalam $ NetworkPorts; lakukan # Dapatkan untuk semua port perangkat keras yang tersedia statusnya
diaktifkan = $ (ifconfig -uv "$ val" | grep 'status:' | awk '{print $ 2}')
#echo $ diaktifkan
label = $ (ifconfig -uv "$ val" | grep 'type' | awk '{print $ 2}')
#echo $ label
#ActiveNetwork = $ (rute dapatkan default | antarmuka grep | awk '{print $ 2}')
ActiveNetworkName = $ (pengaturan jaringan -listallhardwareport | grep -B 1 "$ label" | awk '/ Port Hardware / {print}' | cut -d "" -f3- | uniq)
#echo $ ActiveNetwork
#echo $ ActiveNetworkName
state = $ (ifconfig -uv "$ val" | grep 'status:' | awk '{print $ 2}')
#echo $ state
ipaddress = $ (ifconfig -uv "$ val" | grep 'inet' | awk '{print $ 2}')
# echo $ ipaddress

if [[-z $ (ifconfig -uv "$ val" | grep 'link rate:' | awk '{print $ 3, $ 4}' | sed 'N; s / \ n / up /')]]; kemudian
networkspeed = "$ (ifconfig -uv" $ val "| grep 'laju tautan:' | awk '{print $ 3}') naik / turun"
lain
networkspeed = "$ (ifconfig -uv" $ val "| grep 'link rate:' | awk '{print $ 3, $ 4}' | sed 'N; s / \ n / atas /') turun"
fi

#echo $ networkspeed
macaddress = $ (ifconfig -uv "$ val" | grep 'ether' | awk '{print $ 2}')
#echo $ macaddress
macal = $ (curl -s "$ sExternalMACALLayanan $ macaddress")
#echo $ macal
quality = $ (ifconfig -uv "$ val" | grep 'kualitas tautan:' | awk '{print $ 3, $ 4}')
#echo $ quality
netmask = $ (ipconfig getpacket "$ val" | grep 'subnet_mask (ip):' | awk '{print $ 3}')
#echo $ netmask
router = $ (ipconfig getpacket "$ val" | router grep '(ip_mult):' | sed 's /.* router (ip_mult): {\ ([^}] * \)}. * / \ 1 /')
#echo $ router
DHCPActive = $ (pengaturan jaringan -getinfo "Wi-Fi" | grep DHCP)
#echo $ DHCPAktif
dnsserver = $ (networksetup -getdnsservers "$ ActiveNetworkName" | awk '{print $ 1, $ 2}' | sed 'N; s / \ n //')
#echo $ dnsserver

jika ["$ diaktifkan" = 'aktif']; kemudian
#echo "Port Jaringan Aktif"
if [[$ ipaddress]]; kemudian
echo "$ ActiveNetworkName ($ val)"
gema "--------------"
# Apakah ini port terkait WiFi? Jika demikian, maka kami ingin nama jaringan
jika ["$ label" = "Wi-Fi"]; kemudian
WiFiName = $ (/ System / Library / PrivateFrameworks / Apple80211.framework / Versi / A / Sumberdaya / bandara -I | grep 'sSSID:' | sed 's /.*: //')
#echo $ WiFiName
echo "Nama Jaringan: $ WiFiName"
fi

echo "Alamat IP: $ ipaddress"
echo "Subnet Mask: $ netmask"
gema "Router: $ router"
echo "IP CIDR: $ ipaddress / $ (mask2cdr $ netmask)"

if [[-z $ dnsserver]]; kemudian
if [[$ DHCPActive]]; kemudian
echo "DNS Server: Setel Dengan DHCP"
lain
echo "Server DNS: Tidak Dikenal"
fi
lain
echo "Server DNS: $ dnsserver"
fi

echo "Alamat MAC: $ ​​macaddress ($ macal)"
echo "Kecepatan Jaringan: $ networkspeed"
echo "Kualitas tautan: $ kualitas"
gema ""
fi

# Jangan tampilkan port yang tidak aktif.
fi

selesai
David Kittell
sumber
Dalam skrip saya, saya telah mengganti permintaan publik dengan: set public (dig +short myip.opendns.com @resolver1.opendns.com) Alasan saya untuk ini adalah bahwa server dns (seperti opendn) lebih kecil kemungkinannya turun dari situs web dan lebih cepat. Dan saya menghapus pernyataan tidur. Tidak perlu menunggu balasan server-dns. Waktu eksekusi untuk skrip saya 177 ms. Anda membutuhkan 5,237 detik, tetapi tentu saja lebih. Masih perbedaan besar.
PeterVP
Saran bagus
David Kittell
2

Saya tidak akan berpura-pura memiliki jawaban untuk pertanyaan ini diurutkan, tetapi ini tetapi ini mungkin membantu.

Anda dapat bertanya bagaimana saat ini akan mengarahkan paket ke sesuatu:

$ route get example.com | grep interface
interface: en8

Dan kemudian Anda dapat bertanya apa "Layanan Jaringan" yang mengelola antarmuka itu:

$ networksetup -listnetworkserviceorder | grep en8
(Hardware Port: Broadcom NetXtreme Gigabit Ethernet Controller, Device: en8)

Tapi jujur, saya ragu bahwa "Layanan Jaringan" adalah 1-1 dengan port perangkat keras. Dan beberapa antarmuka, tun0 misalnya, tidak memiliki "Layanan Jaringan". Setidaknya kadang-kadang tidak.

Ben Hyde
sumber
1

Diambil dari Cari Detail Koneksi Sejarah Wi-Fi dari Command Line of Mac OS X | OSXDaily :

Untuk versi modern Mac OS X, OS X Yosemite 10.10 dan yang lebih baru, gunakan yang berikut ini:

defaults read /Library/Preferences/SystemConfiguration/com.apple.airport.preferences |grep LastConnected -A 7

Hit return dan Anda akan langsung melihat daftar lengkap detail koneksi jaringan nirkabel.

Anda mendapatkan banyak info tentang riwayat koneksi, termasuk detail untuk koneksi saat ini.

Tidak sempurna tetapi Anda mendapatkan info yang Anda cari - dan banyak info tambahan lainnya!

Jarava
sumber
1

Ini skrip kulit ikan yang saya tulis:

function netinfo -d "get network information"

  # Get public ip address
  set public (dig +short myip.opendns.com @resolver1.opendns.com)
  set hostname (uname -n)

  if test -z "$public" # We got an empty string, meaning:
    set public "No Internet connection available"
  end

  echo ''
  echo "    Public IP: $public"
  echo "     Hostname: $hostname"
  echo ''

  # Get all available hardware ports
  set ports (ifconfig -uv | grep '^[a-z0-9]' | awk -F : '{print $1}')

  # Get for all available hardware ports their status
  for val in $ports
    set activated (ifconfig -uv $val | grep 'status: ' | awk '{print $2}')

    # We want information about active network ports...
    if test $activated = 'active' ^/dev/null
      set ipaddress (ifconfig -uv $val | grep 'inet ' | awk '{print $2}')

      # and of these, the ones with an IP-address assigned to it
      if test -n "$ipaddress" ^/dev/null

        # Do we have an IP address?
        # Then give us the information
        set label (ifconfig -uv $val | grep 'type' | awk '{print $2}')
        set macaddress (ifconfig -uv $val | grep 'ether ' | awk '{print $2}')
        set quality (ifconfig -uv $val | grep 'link quality:' | awk '{print $3, $4}')
        set netmask (ipconfig getpacket $val | grep 'subnet_mask (ip):' | awk '{print $3}')
        set router (ipconfig getpacket $val | grep 'router (ip_mult):' | sed 's/.*router (ip_mult): {\([^}]*\)}.*/\1/')
        set dnsserver (ipconfig getpacket $val | grep 'domain_name_server (ip_mult):' | sed 's/.*domain_name_server (ip_mult): {\([^}]*\)}.*/\1/')

        # Header for the network interfaces
        echo -n $label ; echo -n ' ('; echo -n $val ; echo ')'
        echo "--------------"

        # Is this a WiFi associated port? If so, then we want the network name
        switch $label
          case Wi-Fi
            # Get WiFi network name
            set wifi_name (/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport -I | grep '\sSSID:' | sed 's/.*: //')
            echo " Network Name: $wifi_name"
            # Networkspeed for Wi-Fi
            set networkspeed (/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport -I | grep lastTxRate: | sed 's/.*: //' | sed 's/$/ Mbps/')
          case '*'
            # Networkspeed  for other ports
            set networkspeed (ifconfig -uv $val | grep 'link rate:' | awk '{print $3, $4}')
        end

        echo "   IP-address: $ipaddress"
        echo "  Subnet Mask: $netmask"
        echo "       Router: $router"
        echo "   DNS Server: $dnsserver"
        echo "  MAC-address: $macaddress"
        echo "Network Speed: $networkspeed"
        echo " Link quality: $quality"
        echo ''
      end

      # Don't display the inactive ports.
    else if test $activated = 'inactive' ^/dev/null
    end
  end
end

Ini menunjukkan semua antarmuka jaringan yang aktif dan data yang relevan.

Komentari apa yang tidak Anda inginkan / butuhkan

PeterVP
sumber
1
Mungkin lebih mudah untuk mendefinisikan echo_italicfungsi shell daripada membungkus semua ini echodalam set_colorpanggilan.
nohillside
Semua set_colorperintah bisa dihapus. Mereka hanya 'dekoratif'.
PeterVP
1
set_colorPerintah yang dihapus & memasukkan variabel ke dalam pernyataan gema
PeterVP
0

Tidak yakin apakah ini membantu siapa pun, tetapi karena saya mengutak-atik pertanyaan yang sama, saya datang ke solusi ini:

ifconfig | grep flags=8863 | grep -v bridge

Outputnya akan terlihat seperti ini, dan hanya mencantumkan port ethernet dan wifi yang sedang digunakan:

en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
en1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500

Jika Anda juga ingin melihat alamat IPv4 yang ditetapkan:

ifconfig | grep 'flags=8863\|inet ' | grep -v 'bridge\|127.0.0.1'

Yang menghasilkan sesuatu seperti ini;

en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    inet 192.168.2.147 netmask 0xffffff00 broadcast 192.168.2.255
en1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    inet 192.168.2.244 netmask 0xffffff00 broadcast 192.168.2.255

Alternatif lain:

scutil --nwi

Yang menunjukkan perangkat jaringan online, baris terakhir sebenarnya menunjukkan antarmuka jaringan yang sedang aktif:

Network information

IPv4 network interface information
     en0 : flags      : 0x5 (IPv4,DNS)
           address    : 192.168.2.147
           reach      : 0x00000002 (Reachable)
     en1 : flags      : 0x5 (IPv4,DNS)
           address    : 192.168.2.244
           reach      : 0x00000002 (Reachable)

   REACH : flags 0x00000002 (Reachable)

IPv6 network interface information
   No IPv6 states found


   REACH : flags 0x00000000 (Not Reachable)

Network interfaces: en0 en1

Pemrosesan lebih lanjut, jika perlu, terserah Anda. :-)


catatan:

Pikiran Anda bahwa saya bukan ahli di bendera (8863). Anda dapat menemukan detail flag di file header if.h - Spotlight adalah teman Anda dalam menemukan "if.h". Saya menemukan milik saya misalnya di sini:

/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/Kernel.framework/Versions/A/Headers/net/if.h

yang akan menunjukkan kepada Anda apa arti bendera (ingat: heksadesimal);

#define IFF_UP          0x1             /* interface is up */
#define IFF_BROADCAST   0x2             /* broadcast address valid */
#define IFF_DEBUG       0x4             /* turn on debugging */
#define IFF_LOOPBACK    0x8             /* is a loopback net */
#define IFF_POINTOPOINT 0x10            /* interface is point-to-point link */
#define IFF_NOTRAILERS  0x20            /* obsolete: avoid use of trailers */
#define IFF_RUNNING     0x40            /* resources allocated */
#define IFF_NOARP       0x80            /* no address resolution protocol */
#define IFF_PROMISC     0x100           /* receive all packets */
#define IFF_ALLMULTI    0x200           /* receive all multicast packets */
#define IFF_OACTIVE     0x400           /* transmission in progress */
#define IFF_SIMPLEX     0x800           /* can't hear own transmissions */
#define IFF_LINK0       0x1000          /* per link layer defined bit */
#define IFF_LINK1       0x2000          /* per link layer defined bit */
#define IFF_LINK2       0x4000          /* per link layer defined bit */
#define IFF_ALTPHYS     IFF_LINK2       /* use alternate physical connection */
#define IFF_MULTICAST   0x8000          /* supports multicast */
Hanzaplastique
sumber