Şu anda bağlı olan ağ hizmetini komut satırından nasıl bulabilirim?


20

Mevcut ağ hizmetlerinden hangisinin (örn. Ethernet veya Wi-Fi ) şu anda aktif olduğunu öğrenmek istiyorum . Ağ Tercihleri'nin bu ekran görüntüsünde, Kablosuz'un şu anda etkin olduğunu görebilirsiniz (yeşil nokta):

Ağ Tercihleri

Bu bilgiyi komut satırından nasıl alabilirim?

networksetupKomut beni kullanılabilir ağ servisleri listelemek için izin verir:

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

Ayrıca hizmetle ilgili, aygıt adı gibi bazı ayrıntıları da gösterebilir:

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

Maalesef, hizmetin etkin olduğu bilgiler (ekran görüntüsünün yeşil noktası) bu bilgilerde mevcut değildir. Bu bilgiyi almak için kullanabileceğim başka bir komut var mı?

Yanıtlar:


7

Basitçe sorun

    ifconfig

Tüm ağ arayüzlerini ve durumlarını listeler.


Doğru - her kayıt, değeri statusolan activeveya inactivedeğeri olan bir alan içerir .
nwinkler

1
Eğer internet paylaşıyorsanız size yanlış sonuç verecektir. Diyelim ki Ethernet üzerinden Ethernet internet paylaşıyorsunuz, o zaman hem Ethernet hem de wifi durumu "aktif" olacak
Harshal Chaudhari

3
Bu, hangi hizmetin kullanıldığını göstermez - hem etkinleştirilmiş hem de bir ethernet kablosu takılıysa hem wifi hem de ethernet 'etkin' olarak
görünür

1
Bu, bir bağlantının bağlı olup olmadığını kontrol etmek için oldukça kullanışlıdır. Örneğin ethernet'im genellikle yalnızca işyerinde bağlı. Bu yüzden listede olmadığım için evde olduğumu söyleyebilirim. ifconfig | grep $(networksetup -listnetworkserviceorder | grep 'Ethernet, Device' | sed -E "s/.*(en[0-9]).*/\1/"). Sonra yukarıdakilerin boş olmasına göre yerleri değiştirebilirim.
Chris Rymer

Bu, ağ hizmetleri değil tüm ağ arabirimlerini listeler.
alg

16

Hepsini bir araya getir, bu görevi gerçekleştirmek için bir senaryo yazdım:

#!/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

Komut dosyası önce networksetupkomuttan bir hizmet listesi alır , ardından her bir hizmetin etkin durumda olup olmadığını kontrol eder ifconfig.

networkservice.shÖrneğin, komut dosyasını adlandırın ve geçerli ağ hizmetini almak için yürütün.

$ bash networkservice.sh
USB 10/100/1000 LAN, en4, 00:e0:4a:6b:4d:0c
Wi-Fi, en0, 8c:85:90:a0:4b:ec

tacArayüzler arasında ters sırayla yinelemek için ilk satırı borulamak zorunda kaldım çünkü sık sık WiFi'ye ve ayrıca bir USB ethernet adaptörüne (Ağda tercih edilen cihaz) bağlandım. Bu durumda en çok tercih edilen aktif services=$(networksetup -listnetworkserviceorder | grep 'Hardware Port' | tac)
cihazın

Hiç mantıklı olmayan @ghr networksetup -listnetworkserviceorderzaten "en çok tercih edilen cihaz"
çıktısı veriyor

Görünüşe göre yukarıdaki komut dosyasını biraz değiştirdim, böylece herhangi bir bağlı yerine sadece 1 hizmet yazdırıyor. Daha tacsonra (tercih edilmeyen) hizmetlerin üzerine yazılmaması gerekiyordu $currentservice. Bu orijinal yorumda daha açık olmalıydı.
ghr

5

scutil --dnsKomut size ağ yollarına donanım arayüzü etiketleri eşleştirmek için ihtiyaç duyacağınız tüm ağ yönlendirme bilgileri verir.

Biraz awkve grepbilgi komut dosyası veya aşağı pare gerekiyorsa güzel olabilir. Merak ediyorsanız "if_index" için kavrayışla başlayın.


Yararlı görünüyor - bununla oynayacağım!
nwinkler

3

Sadece başkasının bu genelinde tökezler eğer aşağıdaki kodu yaptığınız gibi daha olabilir.

Bu PeterVP'nin cevabını genişletmek için

Https://www.kittell.net/code/mac-os-x-get-network-information/ adresinden de görülebilir.

#! / Bin / sh

açık
sExternalMACALService = "http://dns.kittell.net/macaltext.php?address="

# Tüm Ağ bağlantı noktalarını listele
NetworkPorts = $ (ifconfig -uv | grep '^ [a-z0-9]' | awk -F: '{print $ 1}')
#echo $ NetworkPorts

# IP Alt Ağ Maskesini CIDR'ye dönüştürme işlevi
mask2cdr ()
{
# "255" olmadığını varsayar. maskede 255 olmayan bir bayttan sonra
yerel x = $ {1 ## * 255.}
set - 0 ^ ^ ^ 128 ^ 192 ^ 224 ^ 240 ^ 248 ^ 252 ^ 254 ^ $ (((($ {# 1} - $ {# x}) * 2)) $ {x %%. *}
X = $ {1 %% $ 3 *}
echo $ ((2 $ + ($ {# x} / 4))))
}

# Uzak / genel IP adresi al
remoteip = $ (dig + short myip.opendns.com @ resolver1.opendns.com)

# Bilgisayar adını al
computername = $ (scutil --get BilgisayarAdı)

# Seri numarası al
sSerialNumber = $ (system_profiler SPHardwareDataType | grep "Seri Numarası (sistem)" | awk '{print $ 4}' | cut -d / -f1)
#echo $ sSerialNumber

# İşletim sistemi adı ve sürümünü edinin - Başlat
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 = "Dağ Aslanı"
;;
9)
OSNAME = "Mavericks"
;;
10)
OSNAME = "Yosemite"
;;
11)
OSName = "El Capitan"
;;
12)
OSNAME = "Sierra"
;;
varsayılan)
OSNAME = "Bilinmeyen"
;;
esac
# İşletim sistemi adı ve sürümünü edinin - Durdur


echo "$ bilgisayaradı"
Eko "--------------"
echo "Bilgisayar İşletim Sistemi: Mac OS X - $ OSName $ OSvers1. $ OSvers2. $ OSvers3"
echo "Bilgisayar Adı: $ bilgisayaradı"
echo "Mevcut Kullanıcı Adı: $ (whoami)"
echo "Seri Numarası: $ sSerialNumber"

eğer [[$ remoteip]]; sonra
echo "Uzak IP Adresi: $ remoteip \ n"
Başka
echo "Uzak IP Adresi: Belirlenemiyor \ n"
fi

$ NetworkPorts'ta val için; do # Kullanılabilir tüm donanım bağlantı noktaları için durumlarını alma
activated = $ (ifconfig -uv "$ val" | grep 'durumu:' | awk '{print $ 2}')
#echo $ etkinleştirildi
label = $ (ifconfig -uv "$ val" | grep 'type' | awk '{print $ 2}')
#echo $ etiketi
#ActiveNetwork = $ (rota varsayılan olsun | grep arayüzü | awk '{print $ 2}')
ActiveNetworkName = $ (networketup -listallhardwareports | grep -B 1 "$ label" | awk '/ Donanım Bağlantı Noktası / {print}' | cut -d "" -f3- | uniq)
#echo $ ActiveNetwork
#echo $ ActiveNetworkName
state = $ (ifconfig -uv "$ val" | grep 'durumu:' | awk '{print $ 2}')
#echo $ eyalet
ipaddress = $ (ifconfig -uv "$ val" | grep 'inet' | awk '{print $ 2}')
# echo $ ipadresi

if [[-z $ (ifconfig -uv "$ val" | grep 'bağlantı hızı:' | awk '{print $ 3, $ 4}' | sed 'N; s / \ n / yukarı /')]]; sonra
networkpeed = "$ (ifconfig -uv" $ val "| grep 'bağlantı oranı:' | awk '{print $ 3}') yukarı / aşağı"
Başka
networkpeed = "$ (ifconfig -uv" $ val "| grep 'bağlantı hızı:' | awk '{print $ 3, $ 4}' | sed 'N; s / \ n / yukarı /') aşağı"
fi

#echo $ ağ hızı
macaddress = $ (ifconfig -uv "$ val" | grep 'ether' | awk '{print $ 2}')
#echo $ macaddress
macal = $ (curl -s "$ sExternalMACALService $ macaddress")
#echo $ macal
quality = $ (ifconfig -uv "$ val" | grep 'bağlantı kalitesi:' | awk '{print $ 3, $ 4}')
#echo $ kalite
netmask = $ (ipconfig getpacket "$ val" | grep 'subnet_mask (ip):' | awk '{print $ 3}')
#echo $ netmask
yönlendirici = $ (ipconfig getpacket "$ val" | grep 'yönlendirici (ip_mult):' | sed 's /.* yönlendirici (ip_mult): {\ ([^}] * \)}. * / \ 1 /')
#echo $ yönlendirici
DHCPActive = $ (networketup -getinfo "Kablosuz" | grep DHCP)
#echo $ DHCPActive
dnsserver = $ (networketup -getdnsservers "$ ActiveNetworkName" | awk '{print $ 1, $ 2}' | sed 'N; s / \ n //')
#echo $ dnsserver

["$ activated" = 'etkin'] ise; sonra
#echo "Ağ Bağlantı Noktası Etkin"
eğer [[$ ipaddress]]; sonra
echo "$ ActiveNetworkName ($ val)"
Eko "--------------"
# Bu WiFi ile ilişkili bir bağlantı noktası mı? Öyleyse, ağ adını istiyoruz
eğer ["$ label" = "Kablosuz"]; sonra
WiFiName = $ (/ Sistem / Kütüphane / PrivateFrameworks / Apple80211.framework / Sürümler / A / Kaynaklar / airport -I | grep '\ sSSID:' | sed 's /.*: //')
#echo $ WiFiAdı
echo "Ağ Adı: $ WiFiName"
fi

echo "IP Adresi: $ ipaddress"
echo "Alt Ağ Maskesi: $ netmask"
echo "Yönlendirici: $ yönlendirici"
echo "IP CIDR: $ ipadresi / $ (mask2cdr $ netmask)"

eğer [[-z $ dnsserver]]; sonra
[[$ DHCPActive]] ise; sonra
echo "DNS Sunucusu: DHCP ile Ayarla"
Başka
echo "DNS Sunucusu: Bilinmiyor"
fi
Başka
echo "DNS Sunucusu: $ dnsserver"
fi

echo "MAC adresi: $ macaddress ($ macal)"
echo "Ağ Hızı: $ ağ hızı"
echo "Bağlantı kalitesi: $ kalite"
Eko " "
fi

# Etkin olmayan bağlantı noktalarını görüntüleme.
fi

tamam

Komut set public (dig +short myip.opendns.com @resolver1.opendns.com) dosyamda genel sorguyu değiştirdim: Bunun için nedenim, bir dns sunucusunun (opendns gibi) bir web sitesinden daha düşük olma olasılığı ve daha hızlı olmasıdır. Ve uyku ifadesini kaldırdım. Dns-server cevabını beklemeye gerek yok. Komut dosyamın yürütme süresi 177 ms. Seninki 5.237 saniye sürüyor, ama elbette daha fazlasını yapıyor. Hala büyük bir fark var.
PeterVP

Büyük öneri
David Kittell

2

Bu sorunun cevabını sıralamış gibi davranmayacağım, ama bu ama bu belki yardımcı olabilir.

Şu anda paketleri bir şeye nasıl yönlendireceğini sorabilirsiniz:

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

Ve sonra o "Ağ Hizmeti" nin bu arayüzü nasıl yönettiğini sorabilirsiniz:

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

Ama dürüst olmak gerekirse, "Ağ Hizmetleri" nin donanım bağlantı noktası olan birebir olduğundan şüpheliyim. Ve bazı arayüzler, örneğin tun0, "Şebeke Servisi" ne sahip değildir. En azından bazen bilmiyorlar.


1

Alındığı Mac OS X komut satırından Bul Ayrıntılı Kablosuz Bağlantı History | OSXDaily :

Mac OS X, OS X Yosemite 10.10 ve daha yeni sürümlerin modern sürümleri için aşağıdakileri kullanın:

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

Geri dönüşe tıkladığınızda kablosuz ağ bağlantısı ayrıntılarının kapsamlı listesini anında göreceksiniz.

Geçerli olanın ayrıntıları da dahil olmak üzere bağlantıların geçmişi hakkında çok fazla bilgi alırsınız.

Mükemmel değil ama aradığınız bilgileri ve daha fazla bilgi edinin!


1

İşte yazdığım bir balık kabuğu betiği:

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

Tüm aktif ağ arayüzlerini ve ilgili verileri gösterir.

Ne istemediğinizi / neye ihtiyacınız olmadığını yorumlayın


1
Bir tanımlamak daha kolay olabilir echo_italicyerine bu sarma kabuk fonksiyonu echoolarak s set_coloraramaları.
nohillside

Tüm set_colorkomutlar kaldırılabilir. Onlar sadece 'dekoratif'.
PeterVP

1
set_colorKomutlar kaldırıldı ve değişkenleri yankı ifadelerine koydu
PeterVP

0

Bunun kimseye yararlı olup olmadığından emin değilim, ama aynı soru ile uğraşırken, bu çözüme geldim:

ifconfig | grep flags=8863 | grep -v bridge

Çıktı şöyle görünecek ve sadece aktif kullanımda olan ethernet portlarını ve wifi'yi listeleyecektir:

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

Atanan IPv4 adresini de görmek istiyorsanız:

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

Hangi böyle bir şey üretir;

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

Başka bir alternatif:

scutil --nwi

Bu, çevrimiçi ağ aygıtlarını gösterir, son satır aslında etkin olan ağ arayüzlerini gösterir:

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

Gerekirse daha fazla işlem yapmak size kalmış. :-)


Not:

Dikkat edin bayraklarda uzman değilim (8863). Bayrak detaylarını if.h başlık dosyasında bulabilirsiniz - Spotlight "if.h" yi bulmakta arkadaşınızdır. Örneğin benimkini burada buldum:

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

bayrakların ne anlama geldiğini gösterecektir (unutmayın: onaltılık);

#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 */
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.