Como posso encontrar endereços IP locais (por exemplo, 192.168.xx ou 10.0.xx) na plataforma Python de forma independente e usando apenas a biblioteca padrão?
python
networking
ip-address
UnkwnTech
fonte
fonte
ifconfig -a
e usar a saída de lá ...ip addr
é muito mais adequado (e mais fácil de analisar, inicializar).bind
um soquete para uma interface específica, será uma questão de política. Se o endereço IP local for necessário para entregá-lo a um par, para que ele possa "ligar de volta", ou seja, para abrir uma conexão de volta à máquina local, a situação depende se existe algum NAT (Network Address Translation) caixas no meio. Se não houver NATs,getsockname
é uma boa escolha.Respostas:
Isso não funcionará sempre (retorna
127.0.0.1
em máquinas com o nome do host em/etc/hosts
como127.0.0.1
), um paliativo seria o que o gimel mostra, emsocket.getfqdn()
vez disso , use . É claro que sua máquina precisa de um nome de host resolvível.fonte
socket.gethostbyname_ex(socket.gethostname())[-1]
Acabei de encontrar isso, mas parece um pouco imprudente, no entanto, eles dizem que tentaram no * nix e eu fiz no Windows e funcionou.
Isso pressupõe que você tenha acesso à Internet e que não há proxy local.
fonte
Este método retorna o IP "primário" na caixa local (aquela com uma rota padrão) .
Python 3 ou 2:
Isso retorna um único IP que é o principal (aquele com uma rota padrão). Se você precisar de todos os IPs conectados a todas as interfaces (incluindo localhost, etc), consulte esta resposta .
Se você estiver protegido por um firewall NAT como a sua caixa wifi em casa, isso não mostrará seu IP NAT público, mas seu IP privado na rede local que possui uma rota padrão para o roteador WIFI local; Para obter o IP externo do seu roteador wifi, é necessário executá-lo nessa caixa ou conectar-se a um serviço externo, como whatismyip.com/whatismyipaddress.com, que pode refletir o IP ... mas isso é completamente diferente da pergunta original. :)
fonte
socket.gethostbyname(socket.gethostname())
dá resultados horríveis.Como um apelido chamado
myip
, isso deve funcionar em qualquer lugar:O mesmo que acima, mas apenas o código Python:
Versão que também funcionará em LANs sem conexão à Internet:
(obrigado @ccpizza )
Antecedentes :
O uso
socket.gethostbyname(socket.gethostname())
não funcionou aqui, porque um dos computadores em que eu estava tinha um/etc/hosts
com entradas duplicadas e referências a si mesmo.socket.gethostbyname()
retorna apenas a última entrada em/etc/hosts
.Esta foi minha tentativa inicial, que elimina todos os endereços, começando com
"127."
:Isso funciona com Python 2 e 3, no Linux e Windows, mas não lida com vários dispositivos de rede ou IPv6. No entanto, ele parou de funcionar em distros recentes do Linux, então tentei essa técnica alternativa. Ele tenta se conectar ao servidor DNS do Google
8.8.8.8
na porta53
:Em seguida, combinei as duas técnicas acima em uma linha que deve funcionar em qualquer lugar e criei o
myip
alias e o snippet do Python na parte superior desta resposta.Com a crescente popularidade do IPv6 e para servidores com várias interfaces de rede, o uso de um módulo Python de terceiros para encontrar o endereço IP é provavelmente mais robusto e confiável do que qualquer um dos métodos listados aqui.
fonte
socket.getaddrinfo()
deve funcionar de maneira consistente em várias plataformas - mas eu só verifiquei no Linux, não me incomodei com nenhum outro sistema operacional./etc/resolve.conf: No such file or directory
e eu tenho o endereço IPv4 local mostrado porifconfig
.Você pode usar o módulo netifaces . Basta digitar:
no shell de comando e ele se instalará na instalação padrão do Python.
Então você pode usá-lo assim:
No meu computador, ele imprimiu:
O autor deste módulo afirma que ele deve funcionar no Windows, UNIX e Mac OS X.
fonte
Método API Socket
consulte https://stackoverflow.com/a/28950776/711085
Desvantagens:
Método refletor
(Observe que isso não responde à pergunta do OP sobre o endereço IP local, por exemplo, 192.168 ...; fornece seu endereço IP público, o que pode ser mais desejável dependendo do caso de uso.)
Você pode consultar algum site como whatismyip.com (mas com uma API), como:
ou se estiver usando python2:
Vantagens:
Desvantagens (e soluções alternativas):
editar : Embora inicialmente eu tenha pensado que esses métodos eram realmente ruins (a menos que você use muitos fallbacks, o código pode ser irrelevante daqui a muitos anos), ele coloca a pergunta "o que é a internet?". Um computador pode ter muitas interfaces apontando para muitas redes diferentes. Para uma descrição mais completa do tópico, o google para
gateways and routes
. Um computador pode acessar uma rede interna por meio de um gateway interno ou acessar a Internet através de um gateway, por exemplo, em um roteador (geralmente o caso). O endereço IP local que o OP pergunta apenas é bem definido em relação a uma única camada de link, então você precisa especificar que ("é a placa de rede ou o cabo Ethernet, do que estamos falando?") . Pode haver várias respostas não exclusivas para esta pergunta, conforme colocadas. No entanto, o endereço IP global na rede mundial de computadores provavelmente está bem definido (na ausência de fragmentação maciça da rede): provavelmente o caminho de retorno através do gateway que pode acessar os TLDs.fonte
Se o computador tiver uma rota para a Internet, isso sempre funcionará para obter o endereço IP local preferido, mesmo que o / etc / hosts não esteja definido corretamente.
fonte
8.8.8.8
é um servidor DNS do Google? Podemos fazê-lo com um servidor DNS local?No Linux:
fonte
ioctl
). O soquete não está vinculado à interface para a qual você deseja informações adicionais - é apenas um mecanismo de comunicação entre o espaço do usuário e o kernel. en.wikipedia.org/wiki/Ioctl lxr.free-electrons.com/source/net/socket.cstruct.pack('16sH14s', iface, socket.AF_INET, '\x00'*14)
deve ser substituído porstruct.pack('16sH14s', iface.encode('utf-8'), socket.AF_INET, b'\x00'*14)
ioctl
é uma interface herdada que não acredito que seja compatível com IPv6 e provavelmente nunca será. Eu acho que o caminho "certo" é via Netlink, o que não é muito simples em Python. Acho libc deve ter a funçãogetifaddrs
que pode ser acessado via pítonsctypes
módulo que pode funcionar - man7.org/linux/man-pages/man3/getifaddrs.3.htmlestou usando o seguinte módulo:
Testado com Windows e Linux (e não requer módulos adicionais para esses) destinados ao uso em sistemas que estão em uma única LAN baseada em IPv4.
A lista fixa de nomes de interface não funciona nas versões recentes do Linux, que adotaram a alteração systemd v197 em relação aos nomes de interface previsíveis, conforme apontado por Alexander . Nesses casos, você precisa substituir manualmente a lista pelos nomes de interface em seu sistema ou usar outra solução, como netifaces .
fonte
enp0s25
. Para obter mais informações, consulte wiki.archlinux.org/index.php/Network_Configuration#Device_namesstruct.pack('256s', bytes(ifname[:15]))
Eu uso isso nas minhas máquinas ubuntu:
Isso não funciona.
fonte
Se você não quiser usar pacotes externos e não quiser contar com servidores externos da Internet, isso pode ajudar. É um exemplo de código que encontrei na Pesquisa de código do Google e modifiquei para retornar as informações necessárias:
Uso:
Como se baseia
windll
, isso funcionará apenas no Windows.fonte
No Debian (testado) e suspeito que a maioria dos Linux ..
No MS Windows (testado)
fonte
hostname: illegal option -- I\nusage: hostname [-fs] [name-of-host]
Uma versão que eu não acredito que tenha sido publicada ainda. Eu testei com python 2.7 no Ubuntu 12.04.
Encontre esta solução em: http://code.activestate.com/recipes/439094-get-the-ip-address-associated-with-a-network-inter/
Resultado de exemplo:
fonte
Variação na resposta de ninjagecko. Isso deve funcionar em qualquer LAN que permita a transmissão UDP e não exija acesso a um endereço na LAN ou na Internet.
fonte
<broadcast>
um nome de host válido? !! Quantos desses tipos de nomes de host verbais são válidos?Receio que não haja boas maneiras independentes de plataforma para fazer isso, além de conectar-se a outro computador e fazer com que ele envie seu endereço IP. Por exemplo: findmyipaddress . Observe que isso não funcionará se você precisar de um endereço IP atrás do NAT, a menos que o computador ao qual está se conectando também esteja atrás do NAT.
Aqui está uma solução que funciona no Linux: obtenha o endereço IP associado a uma interface de rede .
fonte
Uma maneira simples de produzir saída "limpa" por meio de utilitários de linha de comando:
Ele mostrará todos os endereços IPv4 no sistema.
fonte
Para sua informação, posso verificar se o método:
Funciona no OS X (10.6,10.5), Windows XP e em um servidor de departamento RHEL bem administrado. Não funcionou em uma VM CentOS muito mínima na qual eu apenas fiz alguns hackers no kernel. Portanto, nessa instância, você pode apenas procurar um endereço 127.0.0.1 e, nesse caso, fazer o seguinte:
E, em seguida, analise o endereço IP da saída. Deve-se notar que ifconfig não está no PATH de um usuário normal por padrão e é por isso que dou o caminho completo no comando. Eu espero que isso ajude.
fonte
Essa é uma variante da resposta da UnkwnTech - fornece uma
get_local_addr()
função que retorna o endereço IP da LAN principal do host. Estou publicando porque adiciona várias coisas: suporte ao ipv6, tratamento de erros, ignorando localhost / linklocal addrs e usa um endereço TESTNET (rfc5737) para conectar-se.fonte
None
get_local_addr(remove="www.google.com")
retorno? Registrar osocket.error
lançado por _get_local_addr () pode ajudar no diagnóstico.fonte
['fe80::34e8:fe19:1459:2cde%22','fe80::d528:99fb:d572:e289%12', '192.168.56.1', '192.168.1.2']
na área de trabalho do Windows.Isso funcionará na maioria das caixas Linux:
fonte
Esta resposta é minha tentativa pessoal de resolver o problema de obter o IP da LAN, já que
socket.gethostbyname(socket.gethostname())
também retornou 127.0.0.1. Este método não requer da Internet apenas uma conexão LAN. O código é para Python 3.x, mas pode ser facilmente convertido para 2.x. Usando transmissão UDP:fonte
127.0.1.1
é o seu endereço IP real. De um modo mais geral, um computador pode ter qualquer número de endereços IP. Você pode filtrá-los para redes privadas - 127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12 e 192.168.0.0/16.No entanto, não existe uma maneira multiplataforma de obter todos os endereços IP. No Linux, você pode usar o
SIOCGIFCONF
ioctl.fonte
Um ligeiro refinamento da versão dos comandos que usa o comando IP e retorna os endereços IPv4 e IPv6:
fonte
Bem, você pode usar o comando "ip route" no GNU / Linux para saber seu endereço IP atual.
Isso mostra o IP fornecido à interface pelo servidor DHCP em execução no roteador / modem. Geralmente "192.168.1.1/24" é o IP da rede local, onde "24" significa o intervalo de endereços IP possíveis fornecidos pelo servidor DHCP dentro do intervalo da máscara.
Aqui está um exemplo: Observe que o PyNotify é apenas uma adição para esclarecer meu ponto e não é necessário.
A vantagem disso é que você não precisa especificar a interface de rede. Isso é bastante útil ao executar um servidor de soquete
Você pode instalar o PyNotify usando o easy_install ou até o Pip:
ou
ou no script / interpretador python
fonte
Se você está procurando um endereço IPV4 diferente do endereço IP do host local
127.0.0.1
, aqui está uma parte interessante dos códigos python:O que também pode ser escrito em uma única linha:
Mesmo se você colocar
localhost
em/etc/hostname
, o código ainda vai dar o seu endereço IP local.fonte
Para linux, você pode apenas usar
check_output
ohostname -I
comando system da seguinte maneira:fonte
Nota: Isso não está usando a biblioteca padrão, mas é bastante simples.
$ pip install pif
fonte
O netifaces está disponível via pip e easy_install. (Eu sei, não está na base, mas pode valer a instalação.)
O netifaces tem algumas esquisitices nas plataformas:
Aqui estão alguns códigos de netifaces para brincar:
O código acima não mapeia um endereço de volta ao seu nome de interface (útil para gerar regras ebtables / iptables em tempo real). Então, aqui está uma versão que mantém as informações acima com o nome da interface em uma tupla:
E não, não estou apaixonada por compreensões de lista. É assim que meu cérebro funciona hoje em dia.
O seguinte trecho imprimirá tudo:
Aproveitar!
fonte
Uma versão do Python 3.4 utilizando o pacote asyncio recém-introduzido.
Isso se baseia na excelente resposta da UnkwnTech .
fonte
Para obter o endereço IP, você pode usar um comando shell diretamente no python :
fonte