명령 행에서 현재 연결된 네트워크 서비스를 찾는 방법은 무엇입니까?


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-각 레코드에는 값 statusactive있거나 필드가 포함되어 있습니다 inactive.
nwinkler

1
인터넷을 공유하는 경우 잘못된 결과를 제공합니다. Wi-Fi를 통해 이더넷 인터넷을 공유하고 있고 이더넷과 Wi-Fi의 상태가 모두 "활성"상태라고 가정합니다.
Harshal Chaudhari

3
사용 중인 서비스 와 이더넷 코드가 모두 연결된 경우 Wi-Fi와 이더넷이 모두 '활성'으로 표시됩니다.
tog22

1
연결이 연결되어 있지 않은지 확인하는 데 매우 편리합니다. 예를 들어 내 이더넷은 일반적으로 직장에서만 연결됩니다. 목록에없는 것으로 가정에 있다고 추론 할 수 있습니다. ifconfig | grep $(networksetup -listnetworkserviceorder | grep 'Ethernet, Device' | sed -E "s/.*(en[0-9]).*/\1/"). 그런 다음 위의 빈 내용을 기반으로 위치를 전환 할 수 있습니다.
Chris Rymer

이것은 단순히 네트워크 서비스가 아닌 모든 네트워크 인터페이스를 나열합니다.
조류 조류

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

위의 스크립트를 약간 수정하여 연결된 서비스가 아닌 하나의 서비스 만 인쇄하도록하는 것처럼 보입니다. 나는에 있었다 tac그래서 이상 (비 선호) 서비스를 덮어 쓰지 것 $currentservice. 원래 의견에서 더 명확해야합니다.
ghr

5

scutil --dns명령은 하드웨어 인터페이스 레이블을 네트워크 경로에 매핑하는 데 필요한 모든 네트워크 라우팅 정보를 제공합니다.

조금 awkgrep수 꽤 그것을 당신이 스크립트에 정보가 필요하거나 아래로 껍질을 벗기다합니다. 궁금한 경우 "if_index"를 파악하는 것으로 시작하십시오.


유용하게 보입니다. 나는 그것으로 놀아 볼 것입니다!
nwinkler 2016 년

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 ^ $ (((({{11}-$ {# x}) * 2)) $ {x %%. *}
x = $ {1 %% $ 3 *}
에코 $ (($ 2 + ($ {# x} / 4)))
}

# 원격 / 공용 IP 주소 얻기
remoteip = $ (dig + 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 = "요세미티"
;;
11)
OSName = "엘 캐피 탄"
;;
12)
OSName = "Sierra"
;;
기본)
OSName = "알 수 없음"
;;
esac
# 운영 체제 이름 및 버전 가져 오기-중지


에코 "$ computername"
에코 "--------------"
echo "컴퓨터 OS : Mac OS X-$ OSName $ OSvers1. $ OSvers2. $ OSvers3"
echo "컴퓨터 이름 : $ computername"
echo "현재 사용자 이름 : $ (whoami)"
echo "일련 번호 : $ sSerialNumber"

만약 [[$ remoteip]]; 그때
echo "원격 IP 주소 : $ remoteip \ n"
그밖에
echo "원격 IP 주소 : 결정할 수 없습니다 \ n"
fi

$ NetworkPorts의 val; # 사용 가능한 모든 하드웨어 포트에 대한 상태 확인
enabled = $ (ifconfig -uv "$ val"| grep 'status :'| 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 '/ Hardware Port / {print}'| cut -d ""-f3- | uniq)
#echo $ ActiveNetwork
#echo $ ActiveNetworkName
state = $ (ifconfig -uv "$ val"| grep '상태 :'| awk '{print $ 2}')
#echo $ 주
ipaddress = $ (ifconfig -uv "$ val"| grep 'inet'| awk '{print $ 2}')
# 에코 $ 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"
fi

#echo $ networkspeed
macaddress = $ (ifconfig -uv "$ val"| grep 'ether'| awk '{print $ 2}')
#echo $ macaddress
macal = $ (curl -s "$ sExternalMACALService $ macaddress")
# 에코 $ macal
quality = $ (ifconfig -uv "$ val"| grep 'link quality :'| awk '{print $ 3, $ 4}')
# 에코 $ 품질
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 /')
# 에코 $ 라우터
DHCPActive = $ (networksetup -getinfo "Wi-Fi"| grep DHCP)
#echo $ DHCPActive
dnsserver = $ (networksetup -getdnsservers "$ ActiveNetworkName"| awk '{print $ 1, $ 2}'| sed 'N; s / \ n //')
#echo $ dnsserver

[ "$ activated"= 'active'] 인 경우; 그때
#echo "네트워크 포트가 활성화되었습니다"
만약 [[$ ipaddress]]; 그때
echo "$ ActiveNetworkName ($ val)"
에코 "--------------"
# 이것은 WiFi 관련 포트입니까? 그렇다면 네트워크 이름을 원합니다
[ "$ 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)"

만약 [[-z $ dnsserver]]; 그때
[[$ 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와 같은)가 웹 사이트보다 다운 될 가능성이 적고 빠르기 때문입니다. 그리고 나는 수면 진술을 제거했다. dns-server 응답을 기다릴 필요가 없습니다. 내 스크립트의 실행 시간은 177ms입니다. 당신은 5.237 초가 걸리지 만 더 많은 일을합니다. 여전히 큰 차이가 있습니다.
PeterVP 17 년

큰 제안
David Kittell

2

나는이 질문에 대한 답변을 정렬 한 척하지는 않지만 이것이 도움이 될 수 있습니다.

현재 패킷이 어떤 경로로 라우팅되는지 물어볼 수 있습니다.

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

그런 다음 해당 인터페이스를 관리하는 "네트워크 서비스"를 물어볼 수 있습니다.

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

그러나 솔직히 말해서 "네트워크 서비스"는 하드웨어 포트가있는 일대일로 의심됩니다. 예를 들어 tun0과 같은 일부 인터페이스에는 "네트워크 서비스"가 없습니다. 글쎄, 그들은 때때로 그렇지 않습니다.


1

에서 촬영 맥 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_colorecho 문 안에 명령 제거 및 변수 삽입
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.