Як знайти службу підключення до мережі з командного рядка?

Я хотів би дізнатися, які з доступних мережних служб (наприклад, Ethernet або Wi-Fi ) наразі активні. На цьому знімку вікна налаштувань мережі можна побачити, що Wi-Fi наразі активна (зелена точка):

Network Preferences

Як отримати цю інформацію з командного рядка?

Команда networksetup дозволяє перелічити доступні мережеві служби:

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

Він також може відображати деякі відомості про службу, наприклад назву пристрою:

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

На жаль, інформація про те, яка служба активна (зелена точка з знімка екрана), недоступна в цій інформації. Чи є інша команда, яку я можу використовувати для отримання цієї інформації?

13

7 Відповіді

Покладіть все разом, я написав сценарій для виконання цього завдання

#!/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}')
        fi
    fi
done <<< "$(echo "$services")"

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

Скрипт спочатку отримує список служб з команди networksetup , а потім перевіряє, чи кожна служба перебуває в активному стані від ifconfig .

Назвіть скрипт networkservice.sh , наприклад, потім виконайте його, щоб отримати поточну мережеву послугу, на якій ви працюєте.

$ sh networkservice.sh
Wi-Fi
en0
78:31:c1:c2:d7:6c
12
додано
Мені довелося пропустити перший рядок до tac , щоб перейти до інтерфейсів у зворотному порядку, тому що часто у мене є WiFi, а також USB-адаптер Ethernet (який є кращим пристроєм у мережі). У цьому випадку я хочу роздрукувати найбільш бажаний активний пристрій: services = $ (networksetup -listnetworkserviceorder | grep 'Hardware Port' | tac)
додано Автор ishanrc, джерело

Команда scutil --dns надає всю інформацію про маршрутизацію мережі, яку необхідно виконати для відображення ярликів інтерфейсу апаратних засобів на мережні маршрути.

Трохи awk і grep можуть бути досить складними, якщо вам потрібно створити скрипт інформації або зменшити її. Почніть з "if_index", якщо вам цікаво.

4
додано
Це виглядає корисним - я зіграю з цим!
додано Автор Ayo, джерело

Просто питання

    ifconfig

Перерахуйте всі мережеві інтерфейси та їх статус.

4
додано
True - кожен запис містить поле status , яке має значення active або inactive .
додано Автор Ayo, джерело
Це не покаже вам, яка служба використовується - як wifi, так і ethernet показуватимуться як "активні", якщо увімкнено і підключено шнур Ethernet.
додано Автор Helin, джерело
Це просто перераховує всі мережеві інтерфейси, а не мережеві служби.
додано Автор algal, джерело
Це досить зручно для перевірки, якщо з'єднання не підключено. Наприклад, мій Ethernet, як правило, тільки підключений на роботі. Тому я можу зробити висновок, що я вдома, оскільки це не входить до списку. ifconfig | grep $ (networketup -listnetworkserviceorder | grep 'Ethernet, пристрій' | sed -E "s /.* (en [0-9]). */1 /") . Тоді я можу перемикати розташування на основі вищезазначеного, будучи порожнім.
додано Автор user144209, джерело
Це дасть вам помилковий результат, якщо ви надаєте доступ до Інтернету. Припустимо, ваш спільний доступ до мережі Ethernet через wifi тоді статус для Ethernet і wifi буде "активним"
додано Автор Sbluing, джерело

Я не буду претендувати на те, щоб відповідь на це питання було відсортоване, але це може бути корисно.

Ви можете запитати, яким чином він поточно перенаправляє пакети на щось:

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

І тоді ви можете запитати, що "Мережева служба" керує цим інтерфейсом:

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

Але, чесно кажучи, я сумніваюся, що "Мережеві послуги" один до одного з апаратним портом. А деякі інтерфейси, tun0 наприклад, не мають "Мережевої служби". Добре принаймні інколи вони не.

2
додано

Просто накажіть когось, хто натрапив на це, як я зробив код нижче, може бути більше того, що ви шукаєте.

Це розширюється на відповідь PeterVP

Also visible at https://www.kittell.net/code/mac-os-x-get-network-information/

#!/bin/sh

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

# List all Network ports
NetworkPorts=$(ifconfig -uv | grep '^[a-z0-9]' | awk -F : '{print $1}')
#echo $NetworkPorts

# Function to convert IP Subnet Mask to CIDR
mask2cdr ()
{
# Assumes there's no "255." after a non-255 byte in the 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) ))
}

# Get remote/public IP address
remoteip=$(dig +short myip.opendns.com @resolver1.opendns.com)

# Get computer name
computername=$(scutil --get ComputerName)

# Get serial number
sSerialNumber=$(system_profiler SPHardwareDataType |grep "Serial Number (system)" |awk '{print $4}'  | cut -d/ -f1)
#echo $sSerialNumber

# Get operating system name and version - 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="Mountain Lion"
;;
9)
OSName="Mavericks"
;;
10)
OSName="Yosemite"
;;
11)
OSName="El Capitan"
;;
12)
OSName="Sierra"
;;
default)
OSName="Unknown"
;;
esac
# Get operating system name and version - Stop


echo "$computername"
echo "--------------"
echo "      Computer OS:  Mac OS X - $OSName $OSvers1.$OSvers2.$OSvers3"
echo "    Computer Name:  $computername"
echo "Current User Name:  $(whoami)"
echo "    Serial Number:  $sSerialNumber"

if [[ $remoteip ]]; then
echo "Remote IP Address:  $remoteip\n"
else
echo "Remote IP Address:  Unable To Determine\n"
fi

for val in $NetworkPorts; do   # Get for all available hardware ports their status
activated=$(ifconfig -uv "$val" | grep 'status: ' | awk '{print $2}')
#echo $activated
label=$(ifconfig -uv "$val" | grep 'type' | awk '{print $2}')
#echo $label
#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}')
#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 /' ) ]]; then
networkspeed="$(ifconfig -uv "$val" | grep 'link rate: ' | awk '{print $3}' ) up/down"
else
networkspeed="$(ifconfig -uv "$val" | grep 'link rate: ' | awk '{print $3, $4}' | sed 'N;s/\n/ up /' ) down"
fi

#echo $networkspeed
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 $quality
netmask=$(ipconfig getpacket "$val" | grep 'subnet_mask (ip):' | awk '{print $3}')
#echo $netmask
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 [ "$activated" = 'active' ]; then
#echo "Network Port is Active"
if [[ $ipaddress ]]; then
echo "$ActiveNetworkName ($val)"
echo "--------------"
# Is this a WiFi associated port? If so, then we want the network name
if [ "$label" = "Wi-Fi" ]; then
WiFiName=$(/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport -I | grep '\sSSID:' | sed 's/.*: //')
#echo $WiFiName
echo "     Network Name:  $WiFiName"
fi

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

if [[ -z $dnsserver ]]; then
if [[ $DHCPActive ]]; then
echo "       DNS Server:  Set With DHCP"
else
echo "       DNS Server:  Unknown"
fi
else
echo "       DNS Server:  $dnsserver"
fi

echo "      MAC-address:  $macaddress ($macal)"
echo "    Network Speed:  $networkspeed"
echo "     Link quality:  $quality"
echo " "
fi

# Don't display the inactive ports.
fi

done
2
додано
У моєму сценарії я замінив загальнодоступний запит на: set public (dig + short myip.opendns.com @ resolver1.opendns.com) менше, ніж веб-сайт і швидше. І я зняв заяву про сон. Не потрібно чекати відповіді dns-сервера. Час виконання мого сценарію 177 мс. Ваш час займає 5,237 секунд, але, звичайно, більше. Ще велика різниця.
додано Автор NickD, джерело
Велика пропозиція
додано Автор dmuir, джерело

Взяті з Знайдіть докладне з’єднання Wi-Fi Історія з командного рядка Mac OS X | OSXDaily :

Для сучасних версій Mac OS X, OS X Yosemite 10.10 і новішої версії використовуйте таке:

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

Поверніть результат і миттєво побачите повний список деталей підключення до бездротової мережі.

Ви отримуєте багато інформації про історію з'єднань, включаючи деталі поточного.

Не ідеальний, але ви отримуєте інформацію, яку ви шукаєте - і багато додаткової інформації більше!

1
додано

Ось сценарій, який я написав:

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

Він показує всі активні мережеві інтерфейси та відповідні дані.

Прокоментуйте те, що ви не хочете/потребуєте

1
додано
Можливо, буде легше визначити функцію оболонки echo_italic , замість того, щоб перенести всі ці echo у виклики set_color .
додано Автор Andrew Dunaway, джерело
Усі команди set_color можна видалити. Вони просто "декоративні".
додано Автор NickD, джерело
Команди set_color видалені та поміщені до змінної echo
додано Автор NickD, джерело