¿Cómo encontrar el servicio de red conectado actualmente desde la línea de comandos?

20

Me gustaría saber cuál de los servicios de red disponibles (por ejemplo, Ethernet o Wi-Fi ) está actualmente activo. En esta captura de pantalla de las Preferencias de red, puede ver que el Wi-Fi está actualmente activo (el punto verde):

Preferencias de red

¿Cómo puedo obtener esa información desde la línea de comando?

El networksetupcomando me permite enumerar los servicios de red disponibles:

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

También puede mostrar algunos detalles sobre el servicio, como el nombre del dispositivo:

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

Desafortunadamente, la información sobre qué servicio está activo (el punto verde de la captura de pantalla) no está disponible en esta información. ¿Hay otro comando que pueda usar para obtener esta información?

nwinkler
fuente

Respuestas:

7

Simplemente emitir

    ifconfig

Enumere todas las interfaces de red y su estado.

fd0
fuente
Verdadero: cada registro contiene un statuscampo que tiene activeo inactivecomo un valor.
nwinkler
1
Le dará un resultado falso si está compartiendo su internet. Suponga que está compartiendo internet ethernet a través de wifi, entonces el estado de Ethernet y wifi estará "activo"
Harshal Chaudhari
3
Esto no le muestra qué servicio está siendo utilizado - tanto wifi y ethernet se mostrarán como 'activa' tanto si ha habilitado y un cable Ethernet enchufado.
tog22
1
Esto es bastante útil para verificar si una conexión no está conectada. Por ejemplo, mi ethernet generalmente solo está conectado en el trabajo. Entonces puedo deducir que estoy en casa por no estar en la lista. ifconfig | grep $(networksetup -listnetworkserviceorder | grep 'Ethernet, Device' | sed -E "s/.*(en[0-9]).*/\1/"). Entonces puedo cambiar ubicaciones en base a que lo anterior está vacío.
Chris Rymer
Esto simplemente enumera todas las interfaces de red, no los servicios de red.
algal
16

En conjunto, escribí un script para lograr esta tarea:

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

El script primero obtiene una lista de servicios del networksetupcomando, luego verifica si cada servicio está en estado activo ifconfig.

Asigne un nombre al script, networkservice.shpor ejemplo, luego ejecútelo para obtener el servicio de red actual en el que se encuentra.

$ 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
fuente
Tuve que canalizar la primera línea para taciterar a través de las interfaces en orden inverso porque a menudo tengo WiFi conectado, así como un adaptador de ethernet USB (que es el dispositivo preferido en la red). En este caso, quiero que se imprima el services=$(networksetup -listnetworkserviceorder | grep 'Hardware Port' | tac)
dispositivo
@ghr que no tiene ningún sentido, networksetup -listnetworkserviceorderya genera "el dispositivo más preferido" primero ...
Motsel
Parece que terminé modificando un poco el script anterior para que solo imprima 1 servicio, en lugar de cualquiera conectado. Tenía que hacerlo tacpara que los servicios posteriores (no preferidos) no se sobrescribieran $currentservice. Debería haber sido más claro en ese comentario original.
Ghr
5

El scutil --dnscomando le brinda toda la información de enrutamiento de red que necesitará para asignar etiquetas de interfaz de hardware a rutas de red.

Un poco awky greppuede mejorarlo si necesita escribir la información o reducirla. Comience con agarre para "if_index" si tiene curiosidad.

bmike
fuente
Eso parece útil. ¡Jugaré con eso!
nwinkler
3

Solo en caso de que alguien más se encuentre con esto como hice, el código a continuación puede ser más de lo que está buscando.

Esto es para ampliar la respuesta de PeterVP

También visible en https://www.kittell.net/code/mac-os-x-get-network-information/

#! / bin / sh

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

# Listar todos los puertos de red
NetworkPorts = $ (ifconfig -uv | grep '^ [a-z0-9]' | awk -F: '{print $ 1}')
#echo $ NetworkPorts

# Función para convertir la máscara de subred IP a CIDR
mask2cdr ()
{
# Asume que no hay "255". después de un byte no 255 en la máscara
local x = $ {1 ## * 255.}
conjunto - 0 ^^^ 128 ^ 192 ^ 224 ^ 240 ^ 248 ^ 252 ^ 254 ^ $ ((($ {# 1} - $ {# x}) * 2)) $ {x %%. *}
x = $ {1 %% $ 3 *}
echo $ (($ 2 + ($ {# x} / 4)))
}

# Obtener dirección IP remota / pública
remoteip = $ (dig + short myip.opendns.com @ resolver1.opendns.com)

# Obtener el nombre de la computadora
computername = $ (scutil --get ComputerName)

# Obtenga el número de serie
sSerialNumber = $ (system_profiler SPHardwareDataType | grep "Número de serie (sistema)" | awk '{print $ 4}' | cut -d / -f1)
#echo $ sSerialNumber

# Obtenga el nombre y la versión del sistema operativo - Inicio
OSvers1 = $ (sw_vers -productVersion | cut -d. -F1)
OSvers2 = $ (sw_vers -productVersion | cut -d. -F2)
OSvers3 = $ (sw_vers -productVersion | cut -d. -F3)
case $ OSvers2 en
8)
OSName = "León de montaña"
;;
9)
OSName = "Mavericks"
;;
10)
OSName = "Yosemite"
;;
11)
OSName = "El Capitan"
;;
12)
OSName = "Sierra"
;;
defecto)
OSName = "Desconocido"
;;
esac
# Obtenga el nombre y la versión del sistema operativo - Detener


echo "$ computername"
eco "--------------"
echo "Sistema operativo: Mac OS X - $ OSName $ OSvers1. $ OSvers2. $ OSvers3"
echo "Nombre de la computadora: $ computername"
echo "Nombre de usuario actual: $ (whoami)"
echo "Número de serie: $ sSerialNumber"

si [[$ remoteip]]; luego
echo "Dirección IP remota: $ remoteip \ n"
más
echo "Dirección IP remota: no se puede determinar \ n"
fi

para val en $ NetworkPorts; do # Obtenga para todos los puertos de hardware disponibles su estado
activado = $ (ifconfig -uv "$ val" | grep 'estado:' | awk '{print $ 2}')
#echo $ activado
label = $ (ifconfig -uv "$ val" | grep 'type' | awk '{print $ 2}')
#echo $ label
#ActiveNetwork = $ (ruta de acceso predeterminada | interfaz grep | awk '{print $ 2}')
ActiveNetworkName = $ (networksetup -listallhardwareports | grep -B 1 "$ label" | awk '/ Hardware Port / {print}' | cut -d "" -f3- | uniq)
#echo $ ActiveNetwork
#echo $ ActiveNetworkName
estado = $ (ifconfig -uv "$ val" | grep 'estado:' | awk '{print $ 2}')
#echo $ state
ipaddress = $ (ifconfig -uv "$ val" | grep 'inet' | awk '{print $ 2}')
# echo $ ipaddress

if [[-z $ (ifconfig -uv "$ val" | grep 'tasa de enlace:' | awk '{print $ 3, $ 4}' | sed 'N; s / \ n / up /')]]; luego
networkspeed = "$ (ifconfig -uv" $ val "| grep 'tasa de enlace:' | awk '{print $ 3}') arriba / abajo"
más
networkspeed = "$ (ifconfig -uv" $ val "| grep 'tasa de enlace:' | 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
calidad = $ (ifconfig -uv "$ val" | grep 'calidad del enlace:' | awk '{print $ 3, $ 4}')
#echo $ calidad
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 ["$ enabled" = 'active']; luego
#echo "El puerto de red está activo"
if [[$ ipaddress]]; luego
echo "$ ActiveNetworkName ($ val)"
eco "--------------"
# ¿Es este un puerto asociado a WiFi? Si es así, entonces queremos el nombre de la red
if ["$ label" = "Wi-Fi"]; luego
WiFiName = $ (/ System / Library / PrivateFrameworks / Apple80211.framework / Versions / A / Resources / airport -I | grep '\ sSSID:' | sed 's /.*: //')
#echo $ WiFiName
echo "Nombre de red: $ WiFiName"
fi

echo "Dirección IP: $ ipaddress"
echo "Máscara de subred: $ máscara de red"
echo "Enrutador: $ enrutador"
echo "IP CIDR: $ ipaddress / $ (mask2cdr $ netmask)"

si [[-z $ dnsserver]]; luego
si [[$ DHCPActive]]; luego
echo "Servidor DNS: configurado con DHCP"
más
echo "Servidor DNS: Desconocido"
fi
más
echo "Servidor DNS: $ dnsserver"
fi

echo "dirección MAC: $ ​​macaddress ($ macal)"
echo "Velocidad de red: $ networkspeed"
echo "Calidad del enlace: $ calidad"
eco " "
fi

# No mostrar los puertos inactivos.
fi

hecho
David Kittell
fuente
En mi script, he reemplazado la consulta pública con: set public (dig +short myip.opendns.com @resolver1.opendns.com) Mi razonamiento es que un servidor dns (como opendns) tiene menos probabilidades de estar inactivo que un sitio web y es más rápido. Y eliminé la declaración de sueño. No es necesario esperar la respuesta del servidor dns. Tiempo de ejecución para mi script 177 ms. El tuyo tarda 5.237 segundos, pero hace más, por supuesto. Sigue siendo una gran diferencia.
PeterVP
Gran sugerencia
David Kittell,
2

No pretendo tener la respuesta a esta pregunta ordenada, pero esto, pero esto puede ser útil.

Puede preguntar cómo enrutará actualmente los paquetes a algo:

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

Y luego puede preguntar qué "Servicio de red" está administrando esa interfaz:

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

Pero, sinceramente, dudo que un "Servicios de red" sea uno a uno con un puerto de hardware. Y algunas interfaces, tun0 por ejemplo, no tienen un "Servicio de red". Bueno, al menos a veces no lo hacen.

Ben Hyde
fuente
1

Tomado de Buscar historial de conexión Wi-Fi detallado desde la línea de comandos de Mac OS X | OSXDaily :

Para las versiones modernas de Mac OS X, OS X Yosemite 10.10 y posteriores, use lo siguiente:

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

Presione regresar y verá instantáneamente la lista completa de detalles de conexión de red inalámbrica.

Obtiene mucha información sobre el historial de conexiones, incluidos los detalles de la actual.

No es perfecto, pero obtienes la información que estás buscando, ¡y mucha más información adicional!

JJarava
fuente
1

Aquí hay un script de concha de pez que escribí:

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

Muestra todas las interfaces de red activas y los datos relevantes.

Comenta lo que no quieres / necesitas

PeterVP
fuente
1
Podría ser más fácil definir una echo_italicfunción de shell en lugar de envolver todos estos echos en set_colorllamadas.
nohillside
Todos los set_colorcomandos pueden ser eliminados. Son simplemente "decorativos".
PeterVP
1
set_colorComandos eliminados y poner variables dentro de las declaraciones de eco
PeterVP
0

No estoy seguro de si esto es útil para alguien, pero como estaba jugando con la misma pregunta, llegué a esta solución:

ifconfig | grep flags=8863 | grep -v bridge

La salida se verá más o menos así, y solo enumera los puertos ethernet y wifi que están en uso activo:

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

Si desea ver también la dirección IPv4 asignada:

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

Lo que produce algo como esto;

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

Otra alternativa:

scutil --nwi

Que muestra los dispositivos de red en línea, la última línea muestra las interfaces de red actualmente activas:

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

El procesamiento adicional, si es necesario, depende de usted. :-)


Nota:

Eso sí, no soy un experto en las banderas (8863). Puede encontrar los detalles del indicador en el archivo de encabezado if.h : Spotlight es su amigo para encontrar "if.h". Encontré el mío por ejemplo aquí:

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

que le mostrará lo que significan las banderas (tenga en cuenta: hexadecimal);

#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
fuente