コマンドラインから現在接続されているネットワークサービスを見つける方法は?


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)

残念ながら、どのサービスがアクティブかに関する情報(スクリーンショットの緑色の点)は、この情報では利用できません。この情報を取得するために使用できる別のコマンドはありますか?

回答:


7

単に発行する

    ifconfig

すべてのネットワークインターフェイスとそのステータスを一覧表示します。


True-各レコードには、値をstatus持つフィールドactiveまたはinactive値としてフィールドが含まれます。
nwinkler

1
あなたのインターネットを共有している場合、それはあなたに間違った結果を与えます。あなたはWiFi経由でイーサネットインターネットを共有している、その後、イーサネットと無線LANの両方のステータスが「アクティブ」になりますと仮定
Harshal Chaudhari

3
これは、サービスがされているかを示していない使用あなたが両方有効にしているとイーサネットケーブルが差し込まれた場合に無線LANとイーサネットの両方が「アクティブ」として表示されます- 。
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、networksetup -listnetworkserviceorderすでに「最も優先されるデバイス」を最初に出力します
...-Motsel

上記のスクリプトを少し変更して、接続されているサービスではなく1つのサービスのみを出力するようになったようです。私がしなければならなかったtacので、後で(非優先)のサービスを上書きしないこと$currentservice。元のコメントでもっと明確にすべきでした。
ghr

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 *}
echo $(($ 2 +($ {#x} / 4)))
}

#リモート/パブリックIPアドレスを取得
remoteip = $(dig + short myip.opendns.com @ resolver1.opendns.com)

#コンピューター名を取得
computername = $(scutil --get ComputerName)

#シリアル番号を取得
sSerialNumber = $(system_profiler SPHardwareDataType | grep "Serial Number(system)" | 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 = "Mountain Lion"
;;
9)
OSName = "Mavericks"
;;
10)
OSName = "ヨセミテ"
;;
11)
OSName = "El Capitan"
;;
12)
OSName = "Sierra"
;;
デフォルト)
OSName = "不明"
;;
エサック
#オペレーティングシステムの名前とバージョンを取得-停止


echo "$ computername"
エコー " -  -  -  -  -  -  - "
echo "コンピューターOS:Mac OS X-$ OSName $ OSvers1。$ OSvers2。$ OSvers3"
echo "コンピューター名:$ computername"
echo "現在のユーザー名:$(whoami)"
echo "シリアル番号:$ sSerialNumber"

if [[$ remoteip]]; それから
echo "リモートIPアドレス:$ remoteip \ n"
そうしないと
echo "リモートIPアドレス:判別できません\ n"
fi

$ NetworkPortsのvalの場合。do#利用可能なすべてのハードウェアポートのステータスを取得する
activate = $(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 '/ハードウェアポート/ {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 /')]]; それから
networkspeed = "$(ifconfig -uv" $ val "| grep 'link rate:' | awk '{print $ 3}')アップ/ダウン"
そうしないと
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']; それから
#echo「ネットワークポートはアクティブです」
if [[$ ipaddress]]; それから
echo "$ ActiveNetworkName($ val)"
エコー " -  -  -  -  -  -  - "
#これはWiFiに関連付けられたポートですか?その場合、ネットワーク名が必要です
if ["$ label" = "Wi-Fi"]; それから
WiFiName = $(/ System / Library / PrivateFrameworks / Apple80211.framework / Versions / A / Resources / airport -I | grep '\ sSSID:' | sed 's /.*://')
#echo $ WiFiName
echo "ネットワーク名:$ WiFiName"
fi

echo "IPアドレス:$ ipaddress"
echo "サブネットマスク:$ netmask"
echo "ルーター:$ router"
echo "IP CIDR:$ ipaddress / $(mask2cdr $ netmask)"

if [[-z $ dnsserver]]; それから
if [[$ DHCPActive]]; それから
echo "DNSサーバー:DHCPで設定"
そうしないと
echo "DNSサーバー:不明"
fi
そうしないと
echo "DNSサーバー:$ dnsserver"
fi

echo "MACアドレス:$ macaddress($ macal)"
echo "ネットワーク速度:$ networkspeed"
echo "リンク品質:$ quality"
エコー " "
fi

#非アクティブなポートを表示しません。
fi

やった

私のスクリプトでは、パブリッククエリを次のように置き換えています。 set public (dig +short myip.opendns.com @resolver1.opendns.com) この理由は、DNSサーバー(opendnsなど)がWebサイトよりもダウンする可能性が低く、高速であるためです。そして、sleepステートメントを削除しました。dns-serverの応答を待つ必要はありません。私のスクリプトの実行時間は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)

しかし、正直なところ、「ネットワークサービス」がハードウェアポートと1対1であるとは思いません。また、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

Returnキーを押すと、ワイヤレスネットワーク接続の詳細の包括的なリストがすぐに表示されます。

現在の接続の詳細など、接続の履歴に関する多くの情報を取得します。

完璧ではありませんが、探している情報は得られますが、さらに多くの追加情報が得られます!


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エコー文の内部コマンド&置く変数
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

フラグの意味が表示されます(覚えておいてください:16進数)。

#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 */
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.