34 votes

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

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

Network Preferences

Comment puis-je obtenir cette information à partir de la ligne de commande ?

Le site networksetup 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, l'information sur le service qui est actif (le point vert de la capture d'écran) n'est pas disponible dans cette information. Existe-t-il une autre commande que je pourrais utiliser pour obtenir cette information ?

24voto

Reorx Points 341

Pour rassembler le tout, j'ai écrit un script pour accomplir cette tâche :

#!/bin/bash

while read -r 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 <<< "$(networksetup -listnetworkserviceorder | grep 'Hardware Port')"

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 networksetup puis vérifiez si chaque service est en état actif à partir de la commande ifconfig .

Nommer le script pour networkservice.sh par exemple, puis l'exécuter 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

0 votes

J'ai dû ajouter la première ligne à tac d'itérer à travers les interfaces dans l'ordre inverse parce que 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 périphérique actif le plus préféré soit imprimé : services=$(networksetup -listnetworkserviceorder | grep 'Hardware Port' | tac)

0 votes

@ghr cela n'a aucun sens, networksetup -listnetworkserviceorder sort déjà "le dispositif le plus préféré" en premier...

0 votes

Il semble que j'ai fini par modifier un peu le script ci-dessus pour qu'il n'imprime qu'un seul service, au lieu de tous ceux qui sont connectés. J'ai dû tac afin que les services ultérieurs (non préférés) n'écrasent pas les données de la base de données. $currentservice . J'aurais dû être plus clair dans mon commentaire initial.

20voto

Ben Hyde Points 289

Je ne prétends pas avoir la réponse à cette question, mais ceci peut vous aider.

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

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

Et vous pouvez ensuite demander quel "service réseau" 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 "Network Service". En tout cas, parfois elles n'en ont pas.

8voto

Oskar Points 1242

Le site scutil --nwi liste les interfaces et les scutil --dns vous donne toutes les informations de routage réseau dont vous aurez besoin pour mapper les étiquettes d'interface matérielle aux routes réseau.

Un peu awk y grep Vous pouvez l'améliorer si vous avez besoin de script l'information ou de la réduire. Commencez par saisir "if_index" si vous êtes curieux.

Il n'y a pas grand-chose de simple dans la mise en réseau, puisque vous pouvez avoir plusieurs adresses attribuées à une interface et plusieurs connexions à Internet. La route par défaut est souvent la bonne réponse, mais avec les VPN et les applications qui codent en dur des choses comme le DNS sur HTTP et autres, le Carrie par défaut a moins de poids qu'il y a dix ans, lorsque MacOS s'appelait OS X.

0 votes

Cela a l'air utile - je vais m'en occuper !

8voto

Michael Zhou Points 167

Il suffit d'émettre

    ifconfig

Lister toutes les interfaces réseau et leur état.

0 votes

Vrai - chaque enregistrement contient un status qui a soit active o inactive comme valeur.

1 votes

Il vous donnera un résultat erroné si vous partagez votre internet. Supposons que vous partagiez l'internet ethernet via le wifi, l'état de l'Ethernet et du wifi sera "actif".

6 votes

Cela ne permet pas de savoir quel service est en cours de traitement. utilisé - le wifi et l'ethernet s'afficheront comme "actifs" si les deux sont activés et qu'un cordon ethernet est branché.

4voto

meteors Points 2685

En se basant sur les autres réponses et commentaires (lire : je n'ai pas fait ça), cela peut être condensé en une seule ligne :

networksetup -listnetworkserviceorder |grep -B1 "$(route get example.com | awk "/interface/ {print \$2}")"

Il ne fait que nous indiquer quelle interface est utilisée, dans le contexte de votre commande d'interface configurée.

Je l'utilise dans un alias du shell :

# determine which network interface is being used
alias whichif='networksetup -listnetworkserviceorder  |grep -B1 "$(route get example.com | awk "/interface/ {print \$2}")"'

Utilisation

$> whichif
(1) Thunderbolt Ethernet Slot 2
(Hardware Port: Thunderbolt Ethernet Slot 2, Device: en7)

Après la commutation des interfaces :

$> whichif
(2) Wi-Fi
(Hardware Port: Wi-Fi, Device: en0)

0 votes

Le deuxième grep peut se faire à l'intérieur awk : networksetup -listnetworkserviceorder |grep -B1 "$(route get example.com | awk "/interface/ {print \$2}")"

0 votes

@ccpizza J'adore !

0 votes

@ccpizza La vôtre est meilleure, car il s'agit de la même commande sur le client et dans l'alias shell (en ce qui concerne l'échappement quoting~). J'ai mis à jour notre réponse.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X