Comment trouver le service réseau actuellement connecté à partir de la ligne de commande?

20

Je voudrais savoir lequel des services réseau disponibles (par exemple Ethernet ou Wi-Fi ) est actuellement actif. Dans cette capture d'écran des Préférences Réseau, vous pouvez voir que le Wi-Fi est actuellement actif (le point vert):

Préférences réseau

Comment puis-je obtenir ces informations à partir de la ligne de commande?

La networksetupcommande me permet de lister les services réseau disponibles:

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

Il peut également afficher certains détails sur le service, comme le nom de l'appareil:

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

Malheureusement, les informations sur le service actif (le point vert de la capture d'écran) ne sont pas disponibles dans ces informations. Existe-t-il une autre commande que je pourrais utiliser pour obtenir ces informations?

nwinkler
la source

Réponses:

7

Émettez simplement

    ifconfig

Répertoriez toutes les interfaces réseau et leur état.

fd0
la source
Vrai - chaque enregistrement contient un statuschamp qui a activeou inactivecomme valeur.
nwinkler
1
Cela vous donnera un faux résultat si vous partagez votre Internet. Supposons que vous partagez Internet Ethernet via wifi, alors le statut Ethernet et wifi sera "actif"
Harshal Chaudhari
3
Cela ne vous montre pas quel service est utilisé - le wifi et l'Ethernet s'afficheront comme «actifs» si vous avez tous les deux activé et un cordon Ethernet branché.
tog22
1
C'est très pratique pour vérifier si une connexion n'est pas connectée. Par exemple, mon Ethernet n'est généralement connecté qu'au travail. Je peux donc déduire que je suis chez moi en ne figurant pas sur la liste. ifconfig | grep $(networksetup -listnetworkserviceorder | grep 'Ethernet, Device' | sed -E "s/.*(en[0-9]).*/\1/"). Ensuite, je peux changer d'emplacement en fonction du vide ci-dessus.
Chris Rymer
Cela répertorie simplement toutes les interfaces réseau et non les services réseau.
algal
16

Dans l'ensemble, j'ai écrit un script pour accomplir cette tâche:

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

Le script obtient d'abord une liste de services à partir de la networksetupcommande, puis vérifie si chaque service est en état actif à partir de ifconfig.

Nommez le script networkservice.shpar exemple, puis exécutez-le pour obtenir le service réseau actuel sur lequel vous vous trouvez.

$ bash networkservice.sh
USB 10/100/1000 LAN, en4, 00:e0:4a:6b:4d:0c
Wi-Fi, en0, 8c:85:90:a0:4b:ec
Reorx
la source
J'ai dû rediriger la première ligne pour tacparcourir les interfaces dans l'ordre inverse, car j'ai souvent le WiFi connecté ainsi qu'un adaptateur Ethernet USB (qui est le périphérique préféré dans le réseau). Dans ce cas, je veux que le dispositif actif le plus préféré soit imprimé:services=$(networksetup -listnetworkserviceorder | grep 'Hardware Port' | tac)
ghr
@ghr qui n'a aucun sens, génère networksetup -listnetworkserviceorderdéjà "l'appareil le plus préféré" en premier ...
Motsel
On dirait que j'ai fini par modifier un peu le script ci-dessus pour qu'il n'imprime qu'un seul service, plutôt que n'importe quel autre connecté. Je devais le faire tacpour que les services ultérieurs (non préférés) ne soient pas écrasés $currentservice. Aurait dû être plus clair dans ce commentaire original.
ghr
5

La scutil --dnscommande vous donne toutes les informations de routage réseau dont vous aurez besoin pour mapper les étiquettes d'interface matérielle aux itinéraires réseau.

Un peu awket greppeut le faire si vous avez besoin de scripter les informations ou de les réduire. Commencez par saisir "if_index" si vous êtes curieux.

bmike
la source
Cela semble utile - je vais jouer avec ça!
nwinkler
3

Au cas où quelqu'un d'autre tomberait dessus comme je l'ai fait, le code ci-dessous pourrait être plus de ce que vous recherchez.

Ceci est de développer la réponse de PeterVP

Également visible sur https://www.kittell.net/code/mac-os-x-get-network-information/

#! / bin / sh

clair
sExternalMACALService = "http://dns.kittell.net/macaltext.php?address="

# Liste tous les ports réseau
NetworkPorts = $ (ifconfig -uv | grep '^ [a-z0-9]' | awk -F: '{print $ 1}')
#echo $ NetworkPorts

# Fonction pour convertir le masque de sous-réseau IP en CIDR
mask2cdr ()
{
# Suppose qu'il n'y a pas de "255". après un octet non 255 dans le masque
local x = $ {1 ## * 255.}
set - 0 ^^^ 128 ^ 192 ^ 224 ^ 240 ^ 248 ^ 252 ^ 254 ^ $ ((($ {# 1} - $ {# x}) * 2)) $ {x %%. *}
x = $ {1 %% $ 3 *}
écho $ (($ 2 + ($ {# x} / 4))))
}

# Obtenir une adresse IP distante / publique
remoteip = $ (dig + short myip.opendns.com @ resolver1.opendns.com)

# Obtenir le nom de l'ordinateur
nomordinateur = $ (scutil --get ComputerName)

# Obtenez le numéro de série
sSerialNumber = $ (system_profiler SPHardwareDataType | grep "Numéro de série (système)" | awk '{print $ 4}' | cut -d / -f1)
#echo $ sSerialNumber

# Obtenir le nom et la version du système d'exploitation - Démarrer
OSvers1 = $ (sw_vers -productVersion | cut -d. -F1)
OSvers2 = $ (sw_vers -productVersion | cut -d. -F2)
OSvers3 = $ (sw_vers -productVersion | cut -d. -F3)
cas $ OSvers2 dans
8)
OSName = "Mountain Lion"
;;
9)
OSName = "Mavericks"
;;
dix)
OSName = "Yosemite"
;;
11)
OSName = "El Capitan"
;;
12)
OSName = "Sierra"
;;
défaut)
OSName = "Inconnu"
;;
esac
# Obtenir le nom et la version du système d'exploitation - Arrêter


echo "$ nomordinateur"
écho "--------------"
echo "Computer OS: Mac OS X - $ OSName $ OSvers1. $ OSvers2. $ OSvers3"
echo "Nom de l'ordinateur: $ nomordinateur"
echo "Nom d'utilisateur actuel: $ (whoami)"
echo "Numéro de série: $ sSerialNumber"

if [[$ remoteip]]; ensuite
echo "Adresse IP distante: $ remoteip \ n"
autre
echo "Adresse IP distante: impossible à déterminer \ n"
Fi

pour val dans $ NetworkPorts; do # Récupère pour tous les ports matériels disponibles leur état
activé = $ (ifconfig -uv "$ val" | grep 'status:' | awk '{print $ 2}')
#echo $ activé
label = $ (ifconfig -uv "$ val" | grep 'type' | awk '{print $ 2}')
#echo $ label
#ActiveNetwork = $ (route obtenir par défaut | interface 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 'status:' | awk '{print $ 2}')
#echo $ state
ipaddress = $ (ifconfig -uv "$ val" | grep 'inet' | awk '{print $ 2}')
# echo $ ipaddress

if [[-z $ (ifconfig -uv "$ val" | grep 'taux de liaison:' | awk '{print $ 3, $ 4}' | sed 'N; s / \ n / up /')]]; ensuite
networkspeed = "$ (ifconfig -uv" $ val "| grep 'taux de liaison:' | awk '{print $ 3}') haut / bas"
autre
networkspeed = "$ (ifconfig -uv" $ val "| grep 'taux de liaison:' | 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 'qualité du lien:' | awk '{print $ 3, $ 4}')
#echo $ qualité
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

si ["$ activé" = 'actif']; ensuite
#echo "Le port réseau est actif"
if [[$ ipaddress]]; ensuite
echo "$ ActiveNetworkName ($ val)"
écho "--------------"
# S'agit-il d'un port associé au WiFi? Si oui, alors nous voulons le nom du réseau
if ["$ label" = "Wi-Fi"]; ensuite
WiFiName = $ (/ System / Library / PrivateFrameworks / Apple80211.framework / Versions / A / Resources / airport -I | grep '\ sSSID:' | sed 's /.*: //')
#echo $ WiFiName
echo "Nom du réseau: $ WiFiName"
Fi

echo "Adresse IP: $ ipaddress"
echo "Masque de sous-réseau: $ netmask"
echo "Router: $ router"
echo "IP CIDR: $ ipaddress / $ (mask2cdr $ netmask)"

if [[-z $ dnsserver]]; ensuite
si [[$ DHCPActive]]; ensuite
echo "Serveur DNS: réglé avec DHCP"
autre
echo "Serveur DNS: inconnu"
Fi
autre
echo "Serveur DNS: $ dnsserver"
Fi

echo "MAC-address: $ macaddress ($ macal)"
echo "Vitesse du réseau: $ networkspeed"
echo "Qualité du lien: $ qualité"
écho " "
Fi

# N'affiche pas les ports inactifs.
Fi

terminé
David Kittell
la source
Dans mon script, j'ai remplacé la requête publique par: set public (dig +short myip.opendns.com @resolver1.opendns.com) Mon raisonnement est qu'un serveur DNS (comme opendns) est moins susceptible d'être en panne qu'un site Web et est plus rapide. Et j'ai supprimé la déclaration de sommeil. Pas besoin d'attendre la réponse du serveur DNS. Temps d'exécution pour mon script 177 ms. Le vôtre prend 5,237 secondes, mais en fait bien sûr plus. Encore une grosse différence.
PeterVP
Grande suggestion
David Kittell
2

Je ne prétendrai pas que la réponse à cette question soit triée, mais ceci, mais cela peut être utile.

Vous pouvez demander comment il acheminera actuellement les paquets vers quelque chose:

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

Et puis vous pouvez demander ce que "Network Service" gère cette interface:

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

Mais honnêtement, je doute qu'un «Network Services» soit un à un avec un port matériel. Et certaines interfaces, tun0 par exemple, n'ont pas de "service réseau". Eh bien au moins parfois, ils ne le font pas.

Ben Hyde
la source
1

Extrait de l' historique détaillé des connexions Wi-Fi depuis la ligne de commande de Mac OS X | OSXDaily :

Pour les versions modernes de Mac OS X, OS X Yosemite 10.10 et plus récent, utilisez ce qui suit:

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

Appuyez sur Retour et vous verrez instantanément la liste complète des détails de la connexion au réseau sans fil.

Vous obtenez beaucoup d'informations sur l'historique des connexions, y compris les détails de la connexion actuelle.

Pas parfait, mais vous obtenez les informations que vous recherchez - et beaucoup plus d'informations supplémentaires!

JJarava
la source
1

Voici un script de coquille de poisson que j'ai écrit:

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

Il affiche toutes les interfaces réseau actives et les données pertinentes.

Commentez ce que vous ne voulez pas / n'avez pas besoin

PeterVP
la source
1
Il pourrait être plus facile de définir une echo_italicfonction shell au lieu d'envelopper tous ces echos dans des set_colorappels.
nohillside
Toutes les set_colorcommandes peuvent être supprimées. Ils sont juste «décoratifs».
PeterVP
1
Suppression des set_colorcommandes et
insertion de
0

Je ne sais pas si cela est utile à quiconque, mais comme je bricolais avec la même question, je suis arrivé à cette solution:

ifconfig | grep flags=8863 | grep -v bridge

La sortie ressemblera à ceci et ne répertorie que les ports Ethernet et wifi qui sont en cours d'utilisation:

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

Si vous souhaitez également voir l'adresse IPv4 attribuée:

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

Ce qui produit quelque chose comme ça;

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

Une autre alternative:

scutil --nwi

Ce qui montre les périphériques réseau en ligne, la dernière ligne montre en fait les interfaces réseau actuellement actives:

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

Le traitement ultérieur, si nécessaire, dépend de vous. :-)


Remarque:

Remarquez que je ne suis pas un expert des drapeaux (8863). Vous pouvez trouver les détails du drapeau dans le fichier d'en-tête if.h - Spotlight est votre ami pour trouver "if.h". J'ai trouvé le mien par exemple ici:

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

qui vous montrera ce que signifient les drapeaux (gardez à l'esprit: hexadécimal);

#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 */
Hanzaplastique
la source