Preciso de um método de plataforma cruzada para determinar o endereço MAC de um computador em tempo de execução. Para Windows, o módulo 'wmi' pode ser usado e o único método no Linux que consegui encontrar foi executar ifconfig e executar um regex em sua saída. Não gosto de usar um pacote que só funciona em um sistema operacional, e analisar a saída de outro programa não parece muito elegante, sem falar que é sujeito a erros.
Alguém conhece um método de plataforma cruzada (Windows e Linux) para obter o endereço MAC? Se não, alguém conhece métodos mais elegantes do que aqueles que listei acima?
python
windows
linux
networking
Mark Roddy
fonte
fonte
Respostas:
Python 2.5 inclui uma implementação uuid que (em pelo menos uma versão) precisa do endereço mac. Você pode importar a função de localização do mac para seu próprio código facilmente:
O valor de retorno é o endereço mac como um inteiro de 48 bits.
fonte
getnode
documentação diz que retornará um longo aleatório se não conseguir detectar o mac: "Se todas as tentativas de obter o endereço de hardware falharem, escolhemos um número aleatório de 48 bits com seu oitavo bit definido como 1 conforme recomendado em RFC 4122. " Portanto, verifique o oitavo bit!hex(mac)
para obter o familiar formato hexadecimal do mac':'.join(("%012X" % mac)[i:i+2] for i in range(0, 12, 2))
para um MAC maiúsculo com cada byte separado por dois pontos.A solução python pura para este problema no Linux para obter o MAC para uma interface local específica, postada originalmente como um comentário por vishnubob e aprimorada por Ben Mackey nesta receita de estado ativo
Este é o código compatível com Python 3:
fonte
netifaces é um bom módulo a ser usado para obter o endereço mac (e outros endereços). É uma plataforma cruzada e faz mais sentido do que usar socket ou uuid.
localização pypi
Boa introdução ao netifaces
fonte
Outra coisa que você deve observar é que
uuid.getnode()
pode falsificar o endereço MAC retornando um número aleatório de 48 bits que pode não ser o que você esperava. Além disso, não há indicação explícita de que o endereço MAC foi falsificado, mas você pode detectá-lo chamandogetnode()
duas vezes e ver se o resultado varia. Se o mesmo valor for retornado por ambas as chamadas, você tem o endereço MAC, caso contrário, está recebendo um endereço falso.fonte
Às vezes, temos mais de uma interface de rede.
Um método simples para descobrir o endereço mac de uma interface específica é:
chamar o método é simples
fonte
Usando minha resposta aqui: https://stackoverflow.com/a/18031868/2362361
Seria importante saber para qual iface você quer o MAC já que podem existir muitos (bluetooth, vários nics, etc.).
Isso funciona quando você sabe o IP do iface para o qual precisa do MAC, usando
netifaces
(disponível no PyPI):Teste:
fonte
Você pode fazer isso com o psutil, que é multiplataforma:
fonte
import socket
em seguida,[addr.address for n in nics for addr in nics[n] if n == 'enp4s0' and addr.family == socket.AF_PACKET]
resulta em['ab:cd:ef:01:02:03']
Observe que você pode construir sua própria biblioteca de plataforma cruzada em python usando importações condicionais. por exemplo
Isso permitirá que você use chamadas os.system ou bibliotecas específicas da plataforma.
fonte
O pacote getmac de plataforma cruzada funcionará para isso, se você não se importar em assumir uma dependência. Funciona com Python 2.7+ e 3.4+. Ele tentará muitos métodos diferentes até obter um endereço ou retornar Nenhum.
Isenção de responsabilidade: eu sou o autor do pacote.
Atualização (14 de janeiro de 2019): o pacote agora oferece suporte apenas para Python 2.7+ e 3.4+. Você ainda pode usar uma versão mais antiga do pacote se precisar trabalhar com um Python mais antigo (2.5, 2.6, 3.2, 3.3).
fonte
Para obter o
eth0
endereço MAC da interface,fonte
Não conheço uma forma unificada, mas aqui está algo que você pode achar útil:
http://www.codeguru.com/Cpp/IN/network/networkinformation/article.php/c5451
O que eu faria nesse caso seria agrupá-los em uma função e, com base no sistema operacional, ele executaria o comando adequado, analisaria conforme necessário e retornaria apenas o endereço MAC formatado como você deseja. É claro que é tudo igual, exceto que você só precisa fazer isso uma vez, e parece mais limpo do código principal.
fonte
Para o Linux, deixe-me apresentar um script de shell que mostrará o endereço mac e permite alterá-lo (farejamento de MAC).
Cortar argumentos pode ser diferente (não sou um especialista), tente:
Para alterar o MAC, podemos fazer:
mudará o endereço mac para 00: 80: 48: BA: d1: 30 (temporariamente, restaurará o endereço real na reinicialização).
fonte
Alternativamente,
fonte
Para Linux, você pode recuperar o endereço MAC usando um SIOCGIFHWADDR ioctl.
Você marcou a pergunta "python". Não conheço um módulo Python existente para obter essas informações. Você pode usar ctypes para chamar o ioctl diretamente.
fonte