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?

nwinkler
źródło

Odpowiedzi:

6

Po prostu problem

    ifconfig

Wymień wszystkie interfejsy sieciowe i ich status.

fd0
źródło
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
Reorx
źródło
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.

bmike
źródło
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.

Ben Hyde
źródło
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
David Kittell
źródło
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!

JJarava
źródło
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

PeterVP
źródło
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,