Làm thế nào để tìm dịch vụ mạng hiện được kết nối từ dòng lệnh?


20

Tôi muốn tìm hiểu những dịch vụ mạng khả dụng nào (ví dụ Ethernet hoặc Wi-Fi ) hiện đang hoạt động. Trong ảnh chụp màn hình này từ Tùy chọn mạng, bạn có thể thấy Wi-Fi hiện đang hoạt động (dấu chấm màu xanh lá cây):

Tùy chọn mạng

Làm thế nào tôi có thể lấy thông tin đó từ dòng lệnh?

Các networksetuplệnh cho phép tôi vào danh sách các dịch vụ mạng có sẵn:

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

Nó cũng có thể hiển thị một số chi tiết về dịch vụ, như tên thiết bị:

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

Thật không may, thông tin về dịch vụ nào đang hoạt động (dấu chấm màu xanh từ ảnh chụp màn hình) không có sẵn trong thông tin này. Có một lệnh khác mà tôi có thể sử dụng để có được thông tin này?

Câu trả lời:


7

Vấn đề đơn giản

    ifconfig

Liệt kê tất cả các giao diện mạng và trạng thái của chúng.


Đúng - mỗi bản ghi chứa một statustrường có activehoặc inactivelà một giá trị.
nwinkler

1
Nó sẽ cho bạn kết quả sai nếu bạn đang chia sẻ internet của bạn. Giả sử bạn đang chia sẻ internet ethernet qua wifi thì trạng thái cho cả Ethernet và wifi sẽ "hoạt động"
Harshal Chaudhari

3
Điều này không cho bạn biết dịch vụ nào đang được sử dụng - cả wifi và ethernet sẽ hiển thị là 'hoạt động' nếu bạn vừa bật và cắm dây ethernet.
tog22

1
Điều này khá thuận tiện để kiểm tra nếu kết nối không được kết nối. Ví dụ, ethernet của tôi thường chỉ được kết nối tại nơi làm việc. Vì vậy, tôi có thể suy luận tôi đang ở nhà bởi điều này không có trong danh sách. ifconfig | grep $(networksetup -listnetworkserviceorder | grep 'Ethernet, Device' | sed -E "s/.*(en[0-9]).*/\1/"). Sau đó, tôi có thể chuyển đổi vị trí dựa trên ở trên là trống rỗng.
Chris Rymer

Điều này chỉ đơn giản là liệt kê tất cả các giao diện mạng không phải dịch vụ mạng.
tảo

16

Đặt tất cả lại với nhau, tôi đã viết một kịch bản để hoàn thành nhiệm vụ này:

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

Kịch bản đầu tiên nhận danh sách dịch vụ từ networksetup lệnh, sau đó kiểm tra xem mỗi dịch vụ có ở trạng thái hoạt động không ifconfig.

Đặt tên cho kịch bản networkservice.shchẳng hạn, sau đó thực thi nó để có được dịch vụ mạng hiện tại mà bạn đang sử dụng.

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

Tôi đã phải chuyển dòng đầu tiên tacđể lặp qua các giao diện theo thứ tự ngược lại vì tôi thường có kết nối WiFi cũng như bộ chuyển đổi ethernet USB (là thiết bị ưa thích trong Mạng). Trong trường hợp này, tôi muốn bản in hoạt động được ưu tiên nhất sẽ được in:services=$(networksetup -listnetworkserviceorder | grep 'Hardware Port' | tac)
ghr

@ghr không có ý nghĩa gì, networksetup -listnetworkserviceorderđã xuất "thiết bị ưa thích nhất" trước tiên ...
Motsel

Có vẻ như tôi đã sửa đổi đoạn script trên một chút để nó chỉ in ra 1 dịch vụ, thay vì bất kỳ kết nối nào. Tôi đã phải để taccác dịch vụ sau này (không ưu tiên) sẽ không ghi đè $currentservice. Nên đã rõ ràng hơn trong nhận xét ban đầu.
ghr

5

Các scutil --dns lệnh cung cấp cho bạn tất cả các thông tin mạng định tuyến bạn sẽ cần để ánh xạ nhãn giao diện phần cứng để route.

Một chút awkgrepcó thể làm đẹp lên nếu bạn cần kịch bản thông tin hoặc giảm bớt thông tin. Bắt đầu với việc nắm bắt "if_index" nếu bạn tò mò.


Điều đó có vẻ hữu ích - Tôi sẽ chơi xung quanh với điều đó!
nwinkler

3

Chỉ cần người khác vấp phải điều này giống như tôi đã làm đoạn mã dưới đây có thể là nhiều hơn những gì bạn đang tìm kiếm.

Điều này là để mở rộng câu trả lời của PeterVP

Cũng có thể nhìn thấy tại https://www.kittell.net/code/mac-os-x-get-network-inif/

#! / thùng / sh

thông thoáng
sExternalMACALService = "http://dns.kittell.net/macaltext.php?address="

# Liệt kê tất cả các cổng mạng
Cổng mạng = $ (ifconfig -uv | grep '^ [a-z0-9]' | awk -F: '{in $ 1}')
#echo $ NetworkPorts

# Chức năng chuyển đổi Mặt nạ mạng con IP sang CIDR
mặt nạ2cdr ()
{
# Giả sử không có "255." sau một byte không 255 trong mặt nạ
cục bộ x = $ {1 ## * 255.}
đã đặt - 0 ^^ ^ 128 ^ 192 ^ 224 ^ 240 ^ 248 ^ 252 ^ 254 ^ $ ((($ {# 1} - $ {# x}) * 2)) $ {x %%. *}
x = $ {1 %% $ 3 *}
tiếng vang $ (($ 2 + ($ {# x} / 4)))
}

# Nhận địa chỉ IP từ xa / công cộng
remoteip = $ (đào + ngắn myip.opendns.com @ giải quyết1.opendns.com)

# Nhận tên máy tính
tên máy tính = $ (scutil --get Tên máy tính)

# Nhận số sê-ri
sSerialNumber = $ (system_profiler SPHardwareDataType | grep "Số sê-ri (hệ thống)" | awk '{print $ 4}' | cut -d / -f1)
#echo $ sSerialNumber

# Nhận tên và phiên bản hệ điều hành - Bắt đầu
OSvers1 = $ (sw_vers -productVersion | cut -d. -F1)
OSvers2 = $ (sw_vers -productVersion | cut -d. -F2)
OSvers3 = $ (sw_vers -productVersion | cut -d. -F3)
trường hợp $ OSvers2 trong
số 8)
OSName = "Sư tử núi"
;;
9)
OSName = "Mavericks"
;;
10)
OSName = "Yosemite"
;;
11)
OSName = "El Capitan"
;;
12)
OSName = "Sierra"
;;
mặc định)
OSName = "Không xác định"
;;
esac
# Nhận tên và phiên bản hệ điều hành - Dừng


tiếng vang "$ computername"
tiếng vang "--------------"
echo "Hệ điều hành máy tính: Mac OS X - $ OSName $ OSvers1. $ OSvers2. $ OSvers3"
echo "Tên máy tính: $ computername"
echo "Tên người dùng hiện tại: $ (whoami)"
tiếng vang "Số sê-ri: $ sSerialNumber"

if [[$ remoteip]]; sau đó
echo "Địa chỉ IP từ xa: $ remoteip \ n"
khác
echo "Địa chỉ IP từ xa: Không thể xác định \ n"
fi

cho val trong $ NetworkPorts; làm # Nhận cho tất cả các cổng phần cứng có sẵn trạng thái của họ
kích hoạt = $ (ifconfig -uv "$ val" | grep 'trạng thái:' | awk '{in $ 2}')
#echo $ được kích hoạt
nhãn = $ (ifconfig -uv "$ val" | grep 'loại' | awk '{in $ 2}')
#echo $ nhãn
#ActiveNetwork = $ (tuyến đường mặc định | giao diện grep | awk '{print $ 2}')
ActiveNetworkName = $ (networksetup -listallhardwareports | grep -B 1 "$ nhãn" | awk '/ Cổng phần cứng / {print}' | cut -d "" -f3- | uniq)
#echo $ ActiveNetwork
#echo $ ActiveNetworkName
state = $ (ifconfig -uv "$ val" | grep 'trạng thái:' | awk '{in $ 2}')
#echo $ bang
ipaddress = $ (ifconfig -uv "$ val" | grep 'inet' | awk '{in $ 2}')
# tiếng vang $ ipad

if [[-z $ (ifconfig -uv "$ val" | grep 'tỷ lệ liên kết:' | awk '{in $ 3, $ 4}' | sed 'N; s / \ n / up /')]]; sau đó
Networkspeed = "$ (ifconfig -uv" $ val "| grep 'tốc độ liên kết:' | awk '{print $ 3}') lên / xuống"
khác
Networkspeed = "$ (ifconfig -uv" $ val "| grep 'tốc độ liên kết:' | awk '{in $ 3, $ 4}' | sed 'N; s / \ n / up /') xuống"
fi

#echo $ tốc độ mạng
macaddress = $ (ifconfig -uv "$ val" | grep 'ether' | awk '{in $ 2}')
#echo $ macaddress
macal = $ (curl -s "$ sExternalMACALService $ macaddress")
#echo $ macal
quality = $ (ifconfig -uv "$ val" | grep 'chất lượng liên kết:' | awk '{in $ 3, $ 4}')
#echo $ chất lượng
netmask = $ (ipconfig getpacket "$ val" | grep 'subnet_mask (ip):' | awk '{print $ 3}')
#echo $ netmask
bộ định tuyến = $ (ipconfig getpacket "$ val" | grep 'bộ định tuyến (ip_mult):' | sed 's /.* bộ định tuyến (ip_mult): {\ ([^}] * \)}. * / \ 1 /')
#echo $ bộ định tuyến
DHCPActive = $ (Networksetup -getinfo "Wi-Fi" | grep DHCP)
#echo $ DHCPActive
dnsserver = $ (networksetup -getdnsservers "$ ActiveNetworkName" | awk '{in $ 1, $ 2}' | sed 'N; s / \ n //')
#echo $ dnsserver

if ["$ activ" = 'active']; sau đó
#echo "Cổng mạng đang hoạt động"
nếu [[$ ipaddress]]; sau đó
tiếng vang "$ ActiveNetworkName ($ val)"
tiếng vang "--------------"
# Đây có phải là cổng kết nối WiFi không? Nếu vậy, chúng tôi muốn tên mạng
if ["$ nhãn" = "Wi-Fi"]; sau đó
WiFiName = $ (/ Hệ thống / Thư viện / PrivateFrameworks / Apple80211.framework / Phiên bản / A / Tài nguyên / sân bay -I | grep '\ sSSID:' | sed 's /.*: //')
#echo $ WiFiName
tiếng vang "Tên mạng: $ WiFiName"
fi

tiếng vang "Địa chỉ IP: $ ipaddress"
tiếng vang "Mặt nạ mạng con: $ netmask"
echo "Bộ định tuyến: $ bộ định tuyến"
tiếng vang "IP CIDR: $ ipaddress / $ (mask2cdr $ netmask)"

if [[-z $ dnsserver]]; sau đó
nếu [[$ DHCPActive]]; sau đó
echo "Máy chủ DNS: Đặt bằng DHCP"
khác
tiếng vang "Máy chủ DNS: Không xác định"
fi
khác
tiếng vang "Máy chủ DNS: $ dnsserver"
fi

tiếng vang "Địa chỉ MAC: $ ​​macaddress ($ macal)"
echo "Tốc độ mạng: $ tốc độ mạng"
echo "Chất lượng liên kết: $ quality"
tiếng vang ""
fi

# Không hiển thị các cổng không hoạt động.
fi

làm xong

Trong kịch bản của tôi, tôi đã thay thế truy vấn công khai bằng: set public (dig +short myip.opendns.com @resolver1.opendns.com) Lý do của tôi cho điều này là một máy chủ dns (như opendns) ít có khả năng bị sập hơn so với một trang web và nhanh hơn. Và tôi đã gỡ bỏ tuyên bố về giấc ngủ. Không cần phải đợi câu trả lời của máy chủ dns. Thời gian thực hiện cho kịch bản của tôi 177 ms. Bạn mất 5.237 giây, nhưng tất nhiên là nhiều hơn thế. Vẫn là một sự khác biệt lớn.
PeterVP

Gợi ý tuyệt vời
David Kittell

2

Tôi sẽ không giả vờ để có câu trả lời cho câu hỏi này được sắp xếp, nhưng điều này nhưng điều này có thể hữu ích.

Bạn có thể hỏi làm thế nào nó hiện sẽ định tuyến các gói đến một cái gì đó:

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

Và sau đó bạn có thể hỏi "Dịch vụ mạng" đang quản lý giao diện đó là gì:

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

Nhưng thành thật mà nói, tôi nghi ngờ rằng "Dịch vụ mạng" là một với một cổng phần cứng. Và một số giao diện, ví dụ tun0, không có "Dịch vụ mạng". Ít nhất đôi khi họ không.


1

Lấy từ Tìm lịch sử kết nối Wi-Fi chi tiết từ dòng lệnh của Mac OS X | OSXD hàng ngày :

Đối với các phiên bản hiện đại của Mac OS X, OS X Yosemite 10.10 trở lên, hãy sử dụng như sau:

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

Quay trở lại và bạn sẽ thấy ngay danh sách toàn diện các chi tiết kết nối mạng không dây.

Bạn nhận được rất nhiều thông tin về lịch sử của các kết nối, bao gồm các chi tiết cho kết nối hiện tại.

Không hoàn hảo nhưng bạn có được thông tin mà bạn đang tìm kiếm - và nhiều thông tin bổ sung khác!


1

Đây là một kịch bản vỏ cá tôi đã viết:

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

Nó cho thấy tất cả các giao diện mạng hoạt động và dữ liệu liên quan.

Nhận xét những gì bạn không muốn / cần


1
Có thể dễ dàng hơn để xác định echo_italichàm shell thay vì gói tất cả các echos này trong set_colorcác cuộc gọi.
nohillside

Tất cả set_colorcác lệnh có thể được gỡ bỏ. Họ chỉ là "trang trí".
PeterVP

1
Các set_colorlệnh đã bị xóa và đặt các biến trong các câu lệnh echo
PeterVP

0

Không chắc điều này có hữu ích với bất kỳ ai không, nhưng khi tôi đang mày mò với cùng một câu hỏi, tôi đã tìm đến giải pháp này:

ifconfig | grep flags=8863 | grep -v bridge

Đầu ra sẽ trông giống như thế này và chỉ liệt kê các cổng ethernet và wifi đang được sử dụng:

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

Nếu bạn cũng muốn xem địa chỉ IPv4 được chỉ định:

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

Mà sản xuất một cái gì đó như thế này;

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

Một cách khác:

scutil --nwi

Hiển thị các thiết bị mạng trực tuyến, dòng cuối cùng thực sự hiển thị các giao diện mạng hiện đang hoạt động:

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

Tiếp tục xử lý, nếu cần, là tùy thuộc vào bạn. :-)


Ghi chú:

Xin lưu ý rằng tôi không phải là chuyên gia về cờ (8863). Bạn có thể tìm thấy chi tiết cờ trong tệp tiêu đề if.h - Spotlight là bạn của bạn trong việc tìm kiếm "if.h". Tôi tìm thấy ví dụ của tôi ở đây:

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

nó sẽ cho bạn thấy những lá cờ có ý nghĩa gì (hãy ghi nhớ: thập lục phân);

#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 */
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.