如何从命令行查找当前连接的网络服务?


20

我想找出当前可用的哪些网络服务(例如,以太网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)

不幸的是,该信息中没有有关活动服务的信息(屏幕截图中的绿点)。我还有其他命令可以用来获取此信息吗?

Answers:


7

只需发出

    ifconfig

列出所有网络接口及其状态。


True-每个记录包含一个status具有值activeinactive值的字段。
nwinkler

1
如果您共享互联网,它将给您错误的结果。假设您正在通过wifi共享以太网,则以太网和wifi的状态都将为“活动”
Harshal Chaudhari

3
这不会向您显示正在使用的服务-如果同时启用和插入了以太网线,则wifi和以太网都将显示为“活动”
。– tog22

1
这对于检查连接是否未连接非常方便。例如,我的以太网通常仅在工作时连接。因此,我可以通过不在列表中来推断自己在家里。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以太网适配器(这是网络中的首选设备),所以我不得不用第一行的管道以相反的顺序进行迭代。在这种情况下,我希望打印出最喜欢的主动装置:services=$(networksetup -listnetworkserviceorder | grep 'Hardware Port' | tac)
ghr

@ghr没有任何意义,networksetup -listnetworkserviceorder已经先输出了“最喜欢的设备” ...
Motsel

看来我最终对上面的脚本做了一些修改,以使其仅打印出1个服务,而不显示任何已连接的服务。我必须tac确保以后的(非首选)服务不会被覆盖$currentservice。该原始评论应该更清楚了。
ghr19年

5

scutil --dns命令为您提供了将硬件接口标签映射到网络路由所需的所有网络路由信息。

awkgrep几乎可以起来,如果你需要的脚本信息或削减下来。如果您好奇的话,请先抓紧“ if_index”。


这看起来很有用-我会解决的!
nwinkler

3

以防万一有人像我那样偶然发现此问题,下面的代码可能是您所寻找的更多内容。

这是PeterVP的答案的扩展

也可以在https://www.kittell.net/code/mac-os-x-get-network-information/上看到

#!/ bin / sh

明确
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 %%。*}
x = $ {1 %% $ 3 **
回声$(($ 2 +($ {#x} / 4)))
}

#获取远端/公共IP地址
remoteip = $(挖掘+ short myip.opendns.com @ resolver1.opendns.com)

#获取计算机名称
computername = $(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 =“未知”
;;
埃萨克
#获取操作系统名称和版本-停止


回声“ $计算机名”
回声“ --------------”
echo“计算机操作系统:Mac OS X-$ OSName $ OSvers1。$ OSvers2。$ OSvers3”
回声“计算机名称:$ computername”
回声“当前用户名:$(whoami)”
回声“序列号:$ sSerialNumber”

如果[[$ remoteip]]; 然后
回显“远程IP地址:$ remoteip \ n”
其他
回声“远程IP地址:无法确定\ n”
科幻

用于$ NetworkPorts中的val;do#获取所有可用硬件端口的状态
已激活= $(ifconfig -uv“ $ val” | grep'状态:'| awk'{print $ 2}')
#echo $ activated
label = $(ifconfig -uv“ $ val” | grep'type'| awk'{print $ 2}')
#echo $ label
#ActiveNetwork = $(路由获取默认值| grep接口| 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'状态:'| awk'{print $ 2}')
#echo $ state
ipaddress = $(ifconfig -uv“ $ val” | grep'inet'| awk'{print $ 2}')
#echo $ ipaddress

如果[[-z $(ifconfig -uv“ $ val” | grep'链接速率:'| awk'{print $ 3,$ 4}'| sed'N; s / \ n / up /')]]]; 然后
networkspeed =“ $(ifconfig -uv” $ val“ | grep'链接速率:'| awk'{print $ 3}')上/下”
其他
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 $ quality
netmask = $(ipconfig getpacket“ $ val” | grep'subnet_mask(ip):'| awk'{print $ 3}')
#echo $ netmask
router = $(ipconfig getpacket“ $ val” | grep'路由器(ip_mult):'| sed's /.*路由器(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

如果[“ $ activated” ='活动']; 然后
#echo“网络端口处于活动状态”
如果[[$ ipaddress]]; 然后
回声“ $ ActiveNetworkName($ val)”
回声“ --------------”
#这是WiFi相关端口吗?如果是这样,那么我们需要网络名称
如果[“ $ label” =“ Wi-Fi”]; 然后
WiFiName = $(// System / Library / PrivateFrameworks / Apple80211.framework / Versions / A / Resources / airport -I | grep'\ sSSID:'| sed's /.*://')
#echo $ WiFiName
回声“网络名称:$ WiFiName”
科幻

回显“ IP地址:$ ipaddress”
回声“子网掩码:$ netmask”
回声“路由器:$路由器”
echo“ IP CIDR:$ ipaddress / $(mask2cdr $ netmask)”

如果[[-z $ dnsserver]]; 然后
如果[[$ DHCPActive]]; 然后
echo“ DNS服务器:使用DHCP设置”
其他
回声“ DNS服务器:未知”
科幻
其他
回声“ DNS服务器:$ dnsserver”
科幻

echo“ MAC地址:$ macaddress($ macal)”
echo“网络速度:$ networkspeed”
回显“链接质量:$ quality”
回声“
科幻

#不显示非活动端口。
科幻

做完了

在我的脚本中,我将公共查询替换为: set public (dig +short myip.opendns.com @resolver1.opendns.com) 我这样做的原因是,与网站相比,dns服务器(如opendns)关闭的可能性较小,并且速度更快。我删除了睡眠声明。无需等待dns服务器回复。我的脚本的执行时间为177毫秒。您的时间为5.237秒,但当然更多。仍然有很大的区别。
PeterVP '17

很棒的建议
David Kittell '17

2

我不会假装对这个问题的答案进行排序,但这可能会有所帮助。

您可以询问它当前如何将数据包路由到某些东西:

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

然后您可以问什么“网络服务”正在管理该接口:

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

但老实说,我怀疑“网络服务”与硬件端口是一对一的。某些接口(例如tun0)没有“网络服务”。好吧,至少有时候他们没有。


1

自从Mac OS X的命令行查找详细的Wi-Fi连接历史记录| 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外壳函数可能会更容易,而不是将所有这些都包装echoset_color调用中。
nohillside

set_color可以删除所有命令。他们只是“装饰”。
PeterVP '17

1
删除set_color命令并将变量放入echo语句中
PeterVP

0

不知道这是否对任何人都有用,但是由于我在修改同一个问题,因此我想到了以下解决方案:

ifconfig | grep flags=8863 | grep -v bridge

输出将类似于以下内容,并且仅列出正在使用的以太网端口和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 */
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.