Как найти подключенный в данный момент сетевой сервис из командной строки?

20

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

Сетевые настройки

Как я могу получить эту информацию из командной строки?

Команда 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)

К сожалению, информация об активном сервисе (зеленая точка на скриншоте) недоступна в этой информации. Есть ли другая команда, которую я мог бы использовать, чтобы получить эту информацию?

nwinkler
источник

Ответы:

7

Просто выпустить

    ifconfig

Список всех сетевых интерфейсов и их статус.

fd0
источник
True - каждая запись содержит statusполе, которое имеет activeили inactiveимеет значение.
nwinkler
1
Это даст вам ложный результат, если вы делитесь своим интернетом. Предположим, вы используете Ethernet через Wi-Fi, тогда статус Ethernet и Wi-Fi будет «активным»
Харшал Чаудхари
3
Это не показывает, какая служба используется - и Wi-Fi, и Ethernet будут отображаться как «активные», если вы оба включили и подключили шнур Ethernet.
tog22
1
Это очень удобно для проверки, если соединение не подключено. Например, мой Ethernet обычно подключен только на работе. Таким образом, я могу сделать вывод, что я нахожусь дома по этому отсутствию в списке. ifconfig | grep $(networksetup -listnetworkserviceorder | grep 'Ethernet, Device' | sed -E "s/.*(en[0-9]).*/\1/"), Затем я могу поменять местами на основе выше, будучи пустым.
Крис Раймер
Это просто перечисляет все сетевые интерфейсы, а не сетевые сервисы.
Водоросль
16

Собрав все воедино, я написал скрипт для выполнения этой задачи:

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

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

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

$ bash networkservice.sh
USB 10/100/1000 LAN, en4, 00:e0:4a:6b:4d:0c
Wi-Fi, en0, 8c:85:90:a0:4b:ec
Реоркс
источник
Мне пришлось перенаправить первую строку, чтобы tacперебрать интерфейсы в обратном порядке, потому что у меня часто подключен WiFi, а также USB-адаптер Ethernet (который является предпочтительным устройством в сети). В этом случае я хочу, чтобы наиболее предпочтительное активное устройство было напечатано:services=$(networksetup -listnetworkserviceorder | grep 'Hardware Port' | tac)
ghr
@ghr, который не имеет никакого смысла, networksetup -listnetworkserviceorderуже выводит «самое предпочтительное устройство» первым ...
Motsel
Похоже, я немного изменил приведенный выше скрипт, чтобы он печатал только 1 сервис, а не какой-либо подключенный. Мне пришлось сделать tacтак, чтобы более поздние (не предпочтительные) сервисы не перезаписывались $currentservice. Должен был быть более ясным в этом оригинальном комментарии.
гр
5

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

Немного awkи grepможет это сделать, если вам нужно записать информацию или сократить ее. Начните с «if_index», если вам интересно.

bmike
источник
Это выглядит полезным - я поиграю с этим!
nwinkler
3

Просто если кто-то наткнется на это, как я сделал, приведенный ниже код может быть больше того, что вы ищете.

Это чтобы расширить ответ PeterVP

Также виден на https://www.kittell.net/code/mac-os-x-get-network-information/

#! / Bin / ш

Чисто
sExternalMACALService = "http://dns.kittell.net/macaltext.php?address="

# Список всех сетевых портов
NetworkPorts = $ (ifconfig -uv | grep '^ [a-z0-9]' | awk -F: '{print $ 1}')
#echo $ NetworkPorts

# Функция для преобразования маски подсети IP в CIDR
mask2cdr ()
{
# Предполагается, что нет "255." после не 255 байт в маске
местный x = $ {1 ## * 255.}
набор - 0 ^^^ 128 ^ 192 ^ 224 ^ 240 ^ 248 ^ 252 ^ 254 ^ $ ((($ {# 1} - $ {# x}) * 2)) $ {x %%. *}
х = $ {1 %% $ 3 *}
echo $ (($ 2 + ($ {# x} / 4)))
}

# Получить удаленный / публичный IP-адрес
remoteip = $ (копать + коротко myip.opendns.com @ resolver1.opendns.com)

# Получить имя компьютера
имя_компьютера = $ (scutil --get ComputerName)

# Получить серийный номер
sSerialNumber = $ (system_profiler SPHardwareDataType | grep "Серийный номер (система)" | awk '{print $ 4}' | cut -d / -f1)
#echo $ sSerialNumber

# Получить имя и версию операционной системы - Пуск
OSvers1 = $ (sw_vers -productVersion | cut -d. -F1)
OSvers2 = $ (sw_vers -productVersion | cut -d. -F2)
OSvers3 = $ (sw_vers -productVersion | cut -d. -F3)
дело $ OSvers2 в
8)
OSName = "Горный лев"
;;
9)
OSNAME = "Маверикс"
;;
10)
OSName = "Yosemite"
;;
11)
OSName = "El Capitan"
;;
12)
OSName = "Sierra"
;;
дефолт)
OSName = "Неизвестный"
;;
ESAC
# Получить имя и версию операционной системы - Стоп


echo "$ computername"
echo "--------------"
echo "Компьютерная ОС: Mac OS X - $ OSName $ OSvers1. $ OSvers2. $ OSvers3"
echo "Имя компьютера: $ computername"
echo "Текущее имя пользователя: $ (whoami)"
echo "Серийный номер: $ sSerialNumber"

if [[$ remoteip]]; тогда
echo "Удаленный IP-адрес: $ remoteip \ n"
еще
echo "Удаленный IP-адрес: невозможно определить \ n"
фи

для val в $ NetworkPorts; do # Получить для всех доступных аппаратных портов их статус
active = $ (ifconfig -uv "$ val" | grep 'status:' | awk '{print $ 2}')
#echo $ активирован
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 '/ Аппаратный порт / {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 'скорость ссылки:' | awk '{print $ 3, $ 4}' | sed 'N; s / \ n / up /')]]; тогда
networkspeed = "$ (ifconfig -uv" $ val "| grep 'скорость ссылки:' | awk '{print $ 3}') up / down"
еще
networkspeed = "$ (ifconfig -uv" $ val "| grep 'скорость ссылки:' | awk '{print $ 3, $ 4}' | sed 'N; s / \ n / up /') down"
фи

#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 'качество ссылки:' | awk '{print $ 3, $ 4}')
#echo $ качество
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 ["$ activ" = 'active']; тогда
#echo "Сетевой порт активен"
if [[$ ipaddress]]; тогда
echo "$ ActiveNetworkName ($ val)"
echo "--------------"
# Это связанный с WiFi порт? Если так, то мы хотим имя сети
if ["$ label" = "Wi-Fi"]; тогда
WiFiName = $ (/ Система / Библиотека / PrivateFrameworks / Apple80211.framework / Версии / A / Ресурсы / Аэропорт -I | grep '\ sSSID:' | sed 's /.*: //')
#echo $ WiFiName
echo "Имя сети: $ WiFiName"
фи

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

if [[-z $ dnsserver]]; тогда
if [[$ DHCPActive]]; тогда
echo "DNS-сервер: установить с DHCP"
еще
echo "DNS сервер: неизвестен"
фи
еще
echo "DNS-сервер: $ dnsserver"
фи

echo "MAC-адрес: $ macaddress ($ macal)"
echo "Скорость сети: $ networkspeed"
echo "Качество связи: качество $"
эхо ""
фи

# Не отображать неактивные порты.
фи

сделано
Дэвид Киттелл
источник
В моем сценарии я заменил публичный запрос следующим образом: я считаю, set public (dig +short myip.opendns.com @resolver1.opendns.com) что DNS-сервер (например, opendns) с меньшей вероятностью не работает, чем веб-сайт, и работает быстрее. И я удалил заявление сна. Не нужно ждать ответа DNS-сервера. Время выполнения моего скрипта 177 мс. Ваш занимает 5,237 секунды, но делает больше, конечно. Все еще большая разница.
PeterVP
Отличное предложение
Дэвид
2

Я не буду притворяться, что ответ на этот вопрос рассортирован, но это может быть полезно.

Вы можете спросить, как он в данный момент будет перенаправлять пакеты на что-то:

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

И тогда вы можете спросить, какой «Сетевой сервис» управляет этим интерфейсом:

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

Но, честно говоря, я сомневаюсь, что «Сетевые сервисы» один на один с аппаратным портом. А некоторые интерфейсы, например tun0, не имеют «Сетевой сервис». Ну, по крайней мере, иногда они этого не делают.

Бен Хайд
источник
1

Взятые из Найти Детальнее 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

Нажмите Return, и вы сразу увидите исчерпывающий список сведений о подключении к беспроводной сети.

Вы получаете много информации об истории подключений, в том числе информацию о текущем.

Не идеально, но вы получаете информацию, которую вы ищете - и много дополнительной информации больше!

JJarava
источник
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

Он показывает все активные сетевые интерфейсы и соответствующие данные.

Закомментируйте, что вам не нужно / нужно

PeterVP
источник
1
Может быть проще определить функцию echo_italicоболочки вместо того, чтобы заключать все эти вызовы echoв set_colorвызовы.
холме
Все set_colorкоманды могут быть удалены. Они просто «декоративные».
PeterVP
1
Удалены set_colorкоманды и помещены переменные в операторы echo
PeterVP
0

Не уверен, что это кому-нибудь пригодится, но поскольку я возился с тем же вопросом, я пришел к такому решению:

ifconfig | grep flags=8863 | grep -v bridge

Вывод будет выглядеть примерно так, и в нем будут перечислены только активные порты Ethernet и Wi-Fi:

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

Если вы также хотите увидеть назначенный IPv4-адрес:

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

Который производит что-то вроде этого;

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

Другая альтернатива:

scutil --nwi

Который показывает сетевые сетевые устройства, последняя строка показывает текущие активные сетевые интерфейсы:

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

Дальнейшая обработка, если необходимо, зависит от вас. :-)


Замечания:

Напоминаю, что я не специалист по флагам (8863). Вы можете найти подробную информацию о флаге в заголовочном файле if.h - Spotlight - ваш друг в поиске «if.h». Я нашел мой, например, здесь:

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

который покажет вам, что означают флаги (имейте в виду: шестнадцатеричный);

#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
источник