Como encontrar o serviço de rede atualmente conectado na linha de comando?

20

Gostaria de descobrir quais dos serviços de rede disponíveis (por exemplo, Ethernet ou Wi-Fi ) estão ativos no momento. Nesta captura de tela das Preferências de rede, você pode ver que o Wi-Fi está ativo no momento (o ponto verde):

Preferências de rede

Como posso obter essas informações na linha de comando?

O networksetupcomando permite listar os serviços de rede disponíveis:

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

Também pode mostrar alguns detalhes sobre o serviço, como o nome do 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)

Infelizmente, as informações sobre o serviço ativo (o ponto verde da captura de tela) não estão disponíveis nessas informações. Existe outro comando que eu poderia usar para obter essas informações?

nwinkler
fonte

Respostas:

7

Basta emitir

    ifconfig

Listar todas as interfaces de rede e seus status.

fd0
fonte
Verdadeiro - cada registro contém um statuscampo que possui activeou inactivecomo valor.
N
1
Isso lhe dará um resultado falso se você estiver compartilhando sua internet. Suponha que você está compartilhando ethernet internet via wi-fi, em seguida, o status tanto para Ethernet e Wi-Fi será "ativo"
Harshal Chaudhari
3
Isso não mostra qual serviço está sendo usado - o wifi e a ethernet serão mostrados como 'ativos' se você tiver ativado e um cabo ethernet conectado.
tog22
1
Isso é bastante útil para verificar se uma conexão não está conectada. Por exemplo, minha ethernet geralmente só está conectada no trabalho. Então, posso deduzir que estou em casa por não estar na lista. ifconfig | grep $(networksetup -listnetworkserviceorder | grep 'Ethernet, Device' | sed -E "s/.*(en[0-9]).*/\1/"). Então eu posso mudar de local com base no que foi dito acima.
precisa
Isso simplesmente lista todas as interfaces de rede, não os serviços de rede.
algal
16

Juntando tudo, escrevi um script para realizar esta tarefa:

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

O script primeiro obtém uma lista de serviços do networksetupcomando e, em seguida, verifique se cada serviço está no status ativo ifconfig.

Nomeie o script, networkservice.shpor exemplo, e execute-o para obter o serviço de rede atual em que você está.

$ 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
fonte
Eu tive que canalizar a primeira linha para taciterar pelas interfaces na ordem inversa, porque geralmente tenho WiFi conectado e um adaptador Ethernet USB (que é o dispositivo preferido na rede). Nesse caso, quero que o legado ativo mais preferido seja impresso:services=$(networksetup -listnetworkserviceorder | grep 'Hardware Port' | tac)
ghr 1/08/16
@ghr que não faz qualquer sentido, networksetup -listnetworkserviceorderjá produz "o dispositivo preferido mais" em primeiro lugar ...
Motsel
Parece que acabei modificando um pouco o script acima para que ele imprima apenas 1 serviço, em vez de qualquer outro conectado. Eu precisei para tacque os serviços posteriores (não preferenciais) não sobrescrevessem $currentservice. Deveria ter sido mais claro nesse comentário original.
ghr 2/03/19
5

O scutil --dnscomando fornece todas as informações de roteamento de rede necessárias para mapear etiquetas da interface de hardware para rotas de rede.

Um pouco awke greppode melhorar, se você precisar escrever as informações ou reduzi-las. Comece com a busca de "if_index" se você estiver curioso.

bmike
fonte
Isso parece útil - eu vou brincar com isso!
N
3

Caso alguém tropeça nisso, como eu fiz, o código abaixo pode ser mais do que você está procurando.

Isso é para expandir a resposta de PeterVP

Também visível em https://www.kittell.net/code/mac-os-x-get-network-information/

#! / bin / sh

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

# Listar todas as portas de rede
NetworkPorts = $ (ifconfig -uv | grep '^ [a-z0-9]' | awk -F: '{print $ 1}')
#echo $ NetworkPorts

# Função para converter máscara de sub-rede IP em CIDR
mask2cdr ()
{
# Supõe que não há "255". após um byte não 255 na máscara
local x = $ {1 ## * 255.}
set - 0 ^^^ 128 ^ 192 ^ 224 ^ 240 ^ 248 ^ 252 ^ 254 ^ $ (((($ {# 1} - $ {# x}) * 2)) $ {x %%. *}
x = $ {1 %% $ 3 *}
eco $ (($ 2 + ($ {# x} / 4))))
}

# Obter endereço IP público / remoto
remoteip = $ (dig + short myip.opendns.com @ resolv1.opendns.com)

# Obter nome do computador
computername = $ (scutil --get NomeDoComputador)

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

# Obter nome e versão do sistema operacional - Iniciar
OSvers1 = $ (sw_vers -productVersion | cut -d. -F1)
OSvers2 = $ (sw_vers -productVersion | cut -d. -F2)
OSvers3 = $ (sw_vers -productVersion | cut -d. -F3)
case $ OSvers2 em
8)
OSName = "Leão da montanha"
;;
9)
OSName = "Mavericks"
;;
10)
OSName = "Yosemite"
;;
11)
OSName = "El Capitan"
;;
12)
OSName = "Sierra"
;;
padrão)
OSName = "Desconhecido"
;;
esac
# Obter nome e versão do sistema operacional - Parar


eco "$ nomedocomputador"
eco "--------------"
echo "SO do computador: Mac OS X - $ OSName $ OSvers1. $ OSvers2. $ OSvers3"
eco "Nome do computador: $ computername"
echo "Nome de usuário atual: $ (whoami)"
echo "Número de série: $ sSerialNumber"

if [[$ remoteip]]; então
eco "Endereço IP remoto: $ remoteip \ n"
outro
echo "Endereço IP remoto: Não foi possível determinar \ n"
fi

para val em $ NetworkPorts; do # Obtenha para todas as portas de hardware disponíveis seu status
ativado = $ (ifconfig -uv "$ val" | grep 'status:' | awk '{print $ 2}')
#echo $ ativado
label = $ (ifconfig -uv "$ val" | grep 'type' | awk '{print $ 2}')
#echo $ label
#ActiveNetwork = $ (rota obtida como padrão | interface grep | awk '{print $ 2}')
ActiveNetworkName = $ (networksetup -listallhardwareports | grep -B 1 "$ label" | awk '/ Porta de hardware / {print}' | cut -d "" -f3- | uniq)
#echo $ ActiveNetwork
#echo $ ActiveNetworkName
estado = $ (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 'taxa de link:' | awk '{imprime $ 3, $ 4}' | sed 'N; s / \ n / up /')]; então
networkspeed = "$ (ifconfig -uv" $ val "| grep 'taxa de link:' | awk '{print $ 3}') para cima / para baixo"
outro
networkspeed = "$ (ifconfig -uv" $ val "| grep 'taxa de link:' | awk '{print $ 3, $ 4}' | sed 'N; s / \ n / up /') desativado"
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 'qualidade do link:' | 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 ["$ enabled" = 'ativo']; então
#echo "Porta de rede está ativa"
if [[$ ipaddress]]; então
echo "$ ActiveNetworkName ($ val)"
eco "--------------"
# Esta é uma porta associada a WiFi? Nesse caso, queremos o nome da rede
if ["$ label" = "Wi-Fi"]; então
WiFiName = $ (/ Sistema / Biblioteca / PrivateFrameworks / Apple80211.framework / Versões / A / Resources / airport -I | grep '\ sSSID:' | sed 's /.*: //')
#echo $ WiFiName
eco "Nome da rede: $ WiFiName"
fi

eco "Endereço IP: $ ipaddress"
eco "Máscara de sub-rede: $ netmask"
eco "Roteador: $ router"
echo "CIDR IP: $ endereço IP / $ (mask2cdr $ máscara de rede)"

if [[-z $ dnsserver]]; então
if [[$ DHCPActive]]; então
eco "Servidor DNS: definido com DHCP"
outro
eco "Servidor DNS: desconhecido"
fi
outro
eco "Servidor DNS: $ dnsserver"
fi

echo "Endereço MAC: $ ​​macaddress ($ macal)"
eco "Velocidade da rede: $ networkspeed"
eco "Qualidade do link: $ qualidade"
eco ""
fi

# Não exiba as portas inativas.
fi

feito
David Kittell
fonte
No meu script, substituí a consulta pública por: set public (dig +short myip.opendns.com @resolver1.opendns.com) Meu raciocínio é que um servidor dns (como opendns) tem menos probabilidade de ficar inativo do que um site e é mais rápido. E eu removi a declaração de sono. Não é necessário aguardar a resposta do servidor DNS. Tempo de execução para o meu script 177 ms. O seu leva 5,237 segundos, mas faz mais, é claro. Ainda é uma grande diferença.
Petervp
Ótima sugestão
David Kittell
2

Não pretendo ter a resposta para esta pergunta classificada, mas talvez isso seja útil.

Você pode perguntar como atualmente roteará pacotes para algo:

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

E então você pode perguntar qual "Serviço de Rede" está gerenciando essa interface:

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

Mas, honestamente, duvido que um "Serviços de Rede" seja um para um com uma porta de hardware. E algumas interfaces, tun0, por exemplo, não possuem um "Serviço de Rede". Bem, pelo menos às vezes eles não.

Ben Hyde
fonte
1

Extraído de Localizar histórico detalhado de conexões Wi-Fi na linha de comando do Mac OS X | OSXDaily :

Para versões modernas do Mac OS X, OS X Yosemite 10.10 e mais recentes, use o seguinte:

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

Pressione Enter e você verá instantaneamente a lista abrangente dos detalhes da conexão de rede sem fio.

Você obtém muitas informações sobre o histórico de conexões, incluindo os detalhes da atual.

Não é perfeito, mas você obtém as informações que procura - e muitas informações extras mais!

JJarava
fonte
1

Aqui está um script de casca de peixe que escrevi:

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

Ele mostra todas as interfaces de rede ativas e dados relevantes.

Comente o que você não quer / precisa

PeterVP
fonte
1
Pode ser mais fácil definir uma echo_italicfunção shell em vez de agrupar todos esses echos em set_colorchamadas.
nohillside
Todos os set_colorcomandos podem ser removidos. Eles são apenas 'decorativos'.
PeterVP
1
Removido set_colorcomandos e variáveis colocar dentro declarações de eco
Petervp
0

Não tenho certeza se isso é útil para alguém, mas como eu estava mexendo na mesma pergunta, cheguei a esta solução:

ifconfig | grep flags=8863 | grep -v bridge

A saída será semelhante a esta e lista apenas as portas Ethernet e Wi-Fi que estão em uso ativo:

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

Se você também quiser ver o endereço IPv4 atribuído:

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

O que produz algo parecido com isto;

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

Outra alternativa:

scutil --nwi

O que mostra aos dispositivos de rede online a última linha, na verdade, mostra as interfaces de rede atualmente ativas:

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

O processamento adicional, se necessário, depende de você. :-)


Nota:

Lembre-se de que não sou especialista nas bandeiras (8863). Você pode encontrar os detalhes da bandeira no arquivo de cabeçalho if.h - o Spotlight é seu amigo ao encontrar "if.h". Eu encontrei o meu, por exemplo, aqui:

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

que mostrará o que as bandeiras significam (lembre-se: 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
fonte