Jak znaleźć aktualnie podłączoną usługę sieciową z wiersza poleceń?


18

Chciałbym dowiedzieć się, która z dostępnych usług sieciowych (np. Ethernet lub Wi-Fi ) jest obecnie aktywna. Na tym zrzucie ekranu w Preferencjach sieciowych widać, że Wi-Fi jest obecnie aktywne (zielona kropka):

Preferencje sieciowe

Jak mogę uzyskać te informacje z wiersza poleceń?

networksetupKomenda pozwala mi listę dostępnych usług sieciowych:

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

Może także wyświetlać niektóre szczegóły usługi, takie jak nazwa urządzenia:

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

Niestety informacje o aktywnej usłudze (zielona kropka na zrzucie ekranu) nie są dostępne w tych informacjach. Czy istnieje inne polecenie, którego można użyć, aby uzyskać te informacje?

Odpowiedzi:


6

Po prostu problem

    ifconfig

Wymień wszystkie interfejsy sieciowe i ich status.


Prawda - każdy rekord zawiera statuspole, które ma activealbo inactivewartość.
— nwinkler

1
To daje fałszywy wynik, jeśli dzielisz się internetem. Załóżmy, że dzielisz się internetem Ethernet za pośrednictwem Wi-Fi, a następnie status zarówno Ethernet, jak i Wi-Fi będzie „aktywny”
— Harshal Chaudhari,

3
Nie pokazuje to, która usługa jest używana - zarówno Wi-Fi, jak i Ethernet będą wyświetlane jako „aktywne”, jeśli masz zarówno włączone, jak i podłączony kabel Ethernet.
— tog22

1
Jest to bardzo przydatne do sprawdzania, czy połączenie nie jest połączone. Na przykład moja sieć Ethernet jest zazwyczaj podłączona tylko w pracy. Mogę więc wywnioskować, że jestem w domu z tego, że nie ma mnie na liście. ifconfig | grep $(networksetup -listnetworkserviceorder | grep 'Ethernet, Device' | sed -E "s/.*(en[0-9]).*/\1/"). Następnie mogę zmieniać lokalizacje w oparciu o powyższe, że są puste.
— Chris Rymer

To po prostu wyświetla listę wszystkich interfejsów sieciowych, a nie usług sieciowych.
— algal

15

Podsumowując, napisałem skrypt, aby wykonać to zadanie:

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

Skrypt najpierw pobiera listę usług z networksetuppolecenia, a następnie sprawdza, czy każda usługa jest w stanie aktywnym od ifconfig.

Nazwij skrypt networkservice.shna przykład, a następnie uruchom go, aby uzyskać bieżącą usługę sieciową, z której korzystasz.

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

Musiałem przepuścić pierwszą linię, aby taciterować przez interfejsy w odwrotnej kolejności, ponieważ często mam podłączone WiFi, a także adapter Ethernet Ethernet (który jest preferowanym urządzeniem w sieci). W tym przypadku chcę wydrukować najbardziej preferowane aktywne urządzenie:services=$(networksetup -listnetworkserviceorder | grep 'Hardware Port' | tac)
— ghr

@ghr, co nie ma żadnego sensu, networksetup -listnetworkserviceordernajpierw wypisuje „najbardziej preferowane urządzenie” ...
— Motsel

Wygląda na to, że skończyłem trochę modyfikować powyższy skrypt, aby drukował tylko 1 usługę, a nie jakąkolwiek podłączoną. Musiałem tactak, aby późniejsze (niepreferencyjne) usługi nie były nadpisywane $currentservice. Powinien być jaśniejszy w tym oryginalnym komentarzu.
— ghr

5

To scutil --dnspolecenie zawiera wszystkie informacje o routingu sieciowym potrzebne do mapowania etykiet interfejsu sprzętowego na trasy sieciowe.

Trochę awki grepmoże to urozmaicić, jeśli musisz napisać informacje lub parsować je. Zacznij od chwytania dla „if_index”, jeśli jesteś ciekawy.


To wygląda na przydatne - pobawię się tym!
— nwinkler

2

Nie będę udawał, że mam odpowiedź na to pytanie, ale to, ale może być pomocne.

Możesz zapytać, jak obecnie przekieruje pakiety do czegoś:

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

Następnie możesz zapytać, co „usługa sieciowa” zarządza tym interfejsem:

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

Ale szczerze mówiąc, wątpię, aby „Usługi sieciowe” były jeden do jednego z portem sprzętowym. Niektóre interfejsy, na przykład tun0, nie mają „usługi sieciowej”. Cóż, przynajmniej czasami nie.


2

Wystarczy, że ktoś natknie się na to, tak jak zrobiłem poniższy kod, może być więcej tego, czego szukasz.

Ma to na celu rozwinięcie odpowiedzi PeterVP

Widoczny również na https://www.kittell.net/code/mac-os-x-get-network-information/

#! / bin / sh

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

# Lista wszystkich portów sieciowych
NetworkPorts = $ (ifconfig -uv | grep '^ [a-z0-9]' | awk -F: '{print 1 $}')
#echo $ NetworkPorts

# Funkcja do konwersji maski podsieci IP na CIDR
mask2cdr ()
{
# Zakłada, że ​​nie ma „255”. po bajcie innym niż 255 w masce
lokalne x = $ {1 ## * 255.}
zestaw - 0 ^^^ 128 ^ 192 ^ 224 ^ 240 ^ 248 ^ 252 ^ 254 ^ $ (((({# 1} - $ {# x}) * 2)) $ {x %%. *}
x = $ {1 %% 3 $ * *
echo $ ((2 $ + ($ {# x} / 4)))
}

# Uzyskaj zdalny / publiczny adres IP
remoteip = $ (dig + short myip.opendns.com @ resolver1.opendns.com)

# Uzyskaj nazwę komputera
nazwa_komputera = $ (scutil --get nazwa_komputera)

# Uzyskaj numer seryjny
sSerialNumber = $ (system_profiler SPHardwareDataType | grep "Numer seryjny (system)" | awk '{print 4 $} | cut -d / -f1)
#echo $ sSerialNumber

# Uzyskaj nazwę i wersję systemu operacyjnego - Start
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 = „Lew górski”
;;
9)
OSName = „Mavericks”
;;
10)
OSName = „Yosemite”
;;
11)
OSName = „El Capitan”
;;
12)
OSName = „Sierra”
;;
domyślna)
OSName = „Nieznany”
;;
esac
# Uzyskaj nazwę i wersję systemu operacyjnego - Zatrzymaj


echo „$ nazwa_komputera”
Echo "--------------"
echo „System operacyjny komputera: Mac OS X - $ OSName $ OSvers1. $ OSvers2. $ OSvers3”
echo „Nazwa komputera: $ nazwa_komputera”
echo „Obecna nazwa użytkownika: $ (whoami)”
echo „Numer seryjny: $ sSerialNumber”

if [[$ remoteip]]; następnie
echo „Zdalny adres IP: $ remoteip \ n”
jeszcze
echo „Zdalny adres IP: nie można ustalić \ n”
fi

dla val w $ NetworkPorts; do # Uzyskaj status wszystkich dostępnych portów sprzętowych
aktywowany = $ (ifconfig -uv "$ val" | grep 'status:' | awk '{print 2 $}')
#echo $ aktywowane
label = $ (ifconfig -uv "$ val" | grep 'type' | awk '{print $ 2}')
Etykieta #echo $
#ActiveNetwork = $ (route get default | grep interface | awk '{print $ 2}')
ActiveNetworkName = $ (networksetup -listallhardwareports | grep -B 1 "$ label" | awk '/ Hardware Port / {print}' | cut -d "" -f3- | uniq)
#echo $ ActiveNetwork
#echo $ ActiveNetworkName
state = $ (ifconfig -uv "$ val" | grep 'status:' | awk '{print 2 USD})
Stan #echo $
ipaddress = $ (ifconfig -uv "$ val" | grep 'inet' | awk '{print $ 2}')
# echo $ ipaddress

if [[-z $ (ifconfig -uv "$ val" | grep 'szybkość łącza:' | awk '{print 3 $, 4 $}' | sed 'N; s / \ n / up /')]]; następnie
networkspeed = "$ (ifconfig -uv" $ val "| grep 'szybkość łącza:' | awk '{print 3 $}') góra / dół”
jeszcze
networkspeed = "$ (ifconfig -uv" $ val "| grep 'szybkość łącza:' | awk '{print 3 $, 4 $}' | sed 'N; s / \ n / góra /') dół”
fi

#echo $ prędkość sieci
macaddress = $ (ifconfig -uv "$ val" | grep 'ether' | awk '{print $ 2}')
#echo $ macaddress
macal = $ (curl -s "$ sExternalMACALService $ macaddress")
#echo $ macal
quality = $ (ifconfig -uv "$ val" | grep 'link quality:' | awk '{print 3 $, 4 $}')
#echo $ jakość
netmask = $ (ipconfig getpacket "$ val" | grep 'subnet_mask (ip):' | awk '{print $ 3}')
#echo $ maska ​​sieci
router = $ (ipconfig getpacket "$ val" | grep 'router (ip_mult):' | sed 's /.* router (ip_mult): {\ ([^}] * \)}. * / \ 1 /')
#echo $ router
DHCPActive = $ (networksetup -getinfo "Wi-Fi" | grep DHCP)
#echo $ DHCPActive
dnsserver = $ (networksetup -getdnsservers "$ ActiveNetworkName" | awk '{print 1 $, 2 $}' | sed 'N; s / \ n //')
#echo $ dnsserver

if [„$ aktywowane” = „aktywne”]; następnie
#echo „Port sieci jest aktywny”
if [[$ ipaddress]]; następnie
echo „$ ActiveNetworkName ($ val)”
Echo "--------------"
# Czy to jest port związany z WiFi? Jeśli tak, to chcemy nazwę sieci
if [„$ label” = „Wi-Fi”]; następnie
WiFiName = $ (/ System / Library / PrivateFrameworks / Apple80211.framework / Versions / A / Resources / airport -I | grep '\ sSSID:' | sed 's /.*: //')
#echo $ WiFiName
echo „Nazwa sieci: $ WiFiName”
fi

echo „Adres IP: $ ipaddress”
echo „Maska podsieci: $ maska ​​sieci”
echo „Router: $ router”
echo „IP CIDR: $ ipaddress / $ (mask2cdr $ netmask)”

if [[-z $ dnsserver]]; następnie
jeśli [[$ DHCPActive]]; następnie
echo „Serwer DNS: Ustaw za pomocą DHCP”
jeszcze
echo „Serwer DNS: nieznany”
fi
jeszcze
echo „Serwer DNS: $ dnsserver”
fi

echo „Adres MAC: $ ​​macaddress ($ macal)”
echo „Szybkość sieci: $ prędkość sieci”
echo „Jakość łącza: $ jakość”
Echo " "
fi

# Nie wyświetlaj nieaktywnych portów.
fi

Gotowe

W moim skrypcie zastąpiłem publiczne zapytanie następującymi set public (dig +short myip.opendns.com @resolver1.opendns.com) argumentami : Moim powodem jest to, że serwer dns (taki jak opendns) ma mniejsze szanse na awarię niż strona internetowa i jest szybszy. I usunąłem oświadczenie dotyczące snu. Nie trzeba czekać na odpowiedź serwera DNS. Czas wykonania mojego skryptu 177 ms. Twój trwa 5,237 sekund, ale oczywiście więcej. Wciąż duża różnica.
— PeterVP

Świetna sugestia
— David Kittell

1

Zaczerpnięte ze Znajdź szczegółową historię połączeń Wi-Fi z wiersza poleceń Mac OS X | OSXDaily :

W przypadku nowoczesnych wersji systemu Mac OS X, OS X Yosemite 10.10 i nowszych użyj następujących opcji:

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

Naciśnij Return, a natychmiast zobaczysz szczegółową listę szczegółów połączenia z siecią bezprzewodową.

Otrzymasz wiele informacji na temat historii połączeń, w tym szczegóły dotyczące bieżącego.

Nie idealnie, ale masz informacje, których szukasz - i wiele dodatkowych informacji więcej!


1

Oto skrypt skorupy ryby, który napisałem:

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

Pokazuje wszystkie aktywne interfejsy sieciowe i odpowiednie dane.

Skomentuj, czego nie chcesz / potrzebujesz


Może być łatwiej zdefiniować funkcję echo_italicpowłoki zamiast owijać wszystkie te echoznaki w set_colorwywołania.
— nohillside

Wszystkie set_colorpolecenia można usunąć. Są po prostu „dekoracyjne”.
— PeterVP,

1
Usunięto set_colorpolecenia i wstawiono zmienne do instrukcji echa
— PeterVP,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.