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


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)

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

Відповіді:


7

Просто видайте

    ifconfig

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


Щоправда - кожен запис містить statusполе, яке має значення activeабо inactiveяк значення.
nwinkler

1
Це дасть помилковий результат, якщо ви ділитесь своїм Інтернетом. Припустимо, ви користуєтесь мережею Ethernet через Wi-Fi, тоді статус для Ethernet і Wi-Fi буде "активним"
Харшал Чадхарі

3
Це не показує, яка послуга використовується - і wifi, і Ethernet будуть показані як "активні", якщо ви ввімкнули і шнур Ethernet, підключений.
tog22

1
Це досить зручно для перевірки, якщо з'єднання не підключено. Наприклад, моя мережа Ethernet, як правило, підключена лише на роботі. Тож я можу зробити висновок, що перебуваю вдома, якщо цього немає в списку. ifconfig | grep $(networksetup -listnetworkserviceorder | grep 'Ethernet, Device' | sed -E "s/.*(en[0-9]).*/\1/"). Тоді я можу переключити місця на основі того, що вище було порожнім.
Кріс Ример

Це просто перелічує всі мережеві інтерфейси, а не мережеві послуги.
algal

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, що не має жодного сенсу, networksetup -listnetworkserviceorderспочатку виводить "найпопулярніший пристрій" ...
Motsel

Схоже, я трохи змінив вищевказаний сценарій, щоб він видав лише 1 сервіс, а не будь-який підключений. Я повинен був зробити tacтак, щоб пізніше (не вподобані) сервіси не переписали $currentservice. Повинно було бути зрозумілішим у цьому оригінальному коментарі.
GHR

5

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

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


Це виглядає корисно - я з цим пограю!
nwinkler

3

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

Це потрібно розширити на відповідь PeterVP

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

#! / бін / ш

ясний
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 байта в масці
локальний х = $ {1 ## * 255.}
набір - 0 ^^^ 128 ^ 192 ^ 224 ^ 240 ^ 248 ^ 252 ^ 254 ^ $ (((($ {# 1} - $ {# x}) * 2)) $ {x %%. *}
x = $ {1 %% $ 3 *}
echo $ (($ 2 + ($ {# x} / 4)))
}

# Отримати віддалену / загальнодоступну IP-адресу
remoteip = $ (копати + короткий myip.opendns.com @ resolutionver1.opendns.com)

# Отримати ім’я комп’ютера
комп’ютерне ім'я = $ (scutil --get ComputerName)

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

# Отримати ім’я та версію операційної системи - Пуск
OSvers1 = $ (sw_vers -productVersion | вирізати -d. -F1)
OSvers2 = $ (sw_vers -productVersion | вирізати -d. -F2)
OSvers3 = $ (sw_vers -productVersion | вирізати -d. -F3)
випадок $ OSvers2 в
8)
OSName = "Гірський лев"
;;
9)
OSName = "Mavericks"
;;
10)
OSName = "Йосеміті"
;;
11)
OSName = "El Capitan"
;;
12)
OSName = "Сьєрра"
;;
за замовчуванням)
OSName = "Невідомо"
;;
есак
# Отримати ім’я та версію операційної системи - Стоп


відлуння "$ комп'ютерне ім'я"
відлуння "--------------"
echo "Комп'ютерна ОС: Mac OS X - $ OSName $ OSvers1. $ OSvers2. $ OSvers3"
echo "Ім'я комп'ютера: $ computername"
echo "Поточне ім'я користувача: $ (whoami)"
echo "Серійний номер: $ sSerialNumber"

якщо [[$ remoteip]]; потім
echo "Віддалена IP-адреса: $ remoteip \ n"
ще
echo "Віддалена IP-адреса: неможливо визначити \ n"
фі

для val у $ NetworkPorts; do # Отримайте для всіх доступних апаратних портів свій статус
активовано = $ (ifconfig -uv "$ val" | grep 'статус:' | awk '{print $ 2}')
#echo $ активовано
label = $ (ifconfig -uv "$ val" | grep 'type' | awk '{print $ 2}')
#echo $ label
#ActiveNetwork = $ (маршрут отримати за замовчуванням | 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 $ держава
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 /')]]; потім
networkpeed = "$ (ifconfig -uv" $ val "| grep 'швидкість посилання:' | awk '{print $ 3}') вгору / вниз"
ще
networkpeed = "$ (ifconfig -uv" $ val "| grep 'швидкість посилання:' | awk '{print $ 3, $ 4}' | sed 'N; s / \ n / up /') вниз"
фі

#echo $ networkpeed
macaddress = $ (ifconfig -uv "$ val" | grep 'ефір' | awk '{print $ 2}')
#echo $ macaddress
macal = $ (curl -s "$ sExternalMACALService $ macaddress")
#echo $ macal
якість = $ (ifconfig -uv "$ val" | grep 'якість посилання:' | awk "{print $ 3, $ 4} ')
#echo $ якість
netmask = $ (ipconfig getpacket "$ val" | grep 'subnet_mask (ip):' | awk '{print $ 3}')
#echo $ мережна маска
router = $ (ipconfig getpacket "$ val" | grep 'router (ip_mult):' | sed 's /.* router (ip_mult): {\ ([^}] * \)}. * / \ 1 /')
#echo $ роутер
DHCPActive = $ (networksetup -getinfo "Wi-Fi" | grep DHCP)
#echo $ DHCPActive
dnsserver = $ (networksetup -getdnsservers "$ ActiveNetworkName" | awk '{print $ 1, $ 2}' | sed 'N; s / \ n //')
#echo $ dnsserver

if ["$ active" = 'active']; потім
#echo "Мережевий порт активний"
якщо [[$ ipaddress]]; потім
echo "$ ActiveNetworkName ($ val)"
відлуння "--------------"
# Це порт, пов'язаний з WiFi? Якщо так, то ми хочемо назву мережі
if ["$ label" = "Wi-Fi"]; потім
WiFiName = $ (/ Система / Бібліотека / PrivateFrameworks / Apple80211.framework / Версії / A / Ресурси / аеропорт -I | grep '\ sSSID:' | sed 's /.*: //')
#echo $ WiFiName
echo "Назва мережі: $ WiFiName"
фі

echo "IP-адреса: $ ipaddress"
echo "Маска підмережі: $ netmask"
echo "Маршрутизатор: $ router"
echo "IP CIDR: $ ipaddress / $ (mask2cdr $ netmask)"

якщо [[-z $ dnsserver]]; потім
якщо [[$ DHCPActive]]; потім
echo "DNS-сервер: встановити за допомогою DHCP"
ще
echo "DNS-сервер: невідомо"
фі
ще
echo "DNS-сервер: $ dnsserver"
фі

echo "MAC-адреса: $ macaddress ($ macal)"
echo "Швидкість мережі: $ networkpeed"
ехо "Якість посилання: $ якість"
відлуння ""
фі

# Не показуйте неактивні порти.
фі

зроблено

У моєму сценарії я замінив публічний запит на: set public (dig +short myip.opendns.com @resolver1.opendns.com) Моє міркування для цього полягає в тому, що сервер dns (як, наприклад, відкриття) має меншу ймовірність роботи вниз, ніж веб-сайт, і швидший. І я зняв стан сну. Не потрібно чекати відповіді 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

Натисніть повернення, і миттєво побачите повний перелік деталей бездротового мережевого з'єднання.

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

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


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виклики.
nohillside

Усі set_colorкоманди можна видалити. Вони просто "декоративні".
PeterVP

1
Видалені set_colorкоманди та розміщення змінних всередині операторів echo
PeterVP

0

Не впевнений, чи це комусь корисно, але, коли я займався тим самим питанням, я прийшов до цього рішення:

ifconfig | grep flags=8863 | grep -v bridge

Вихід буде виглядати приблизно так і перераховує лише порти Ethernet та wifi, які активно використовуються:

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 */
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.