Estou procurando uma solução de linha de comando que me retorne o (primeiro) endereço IP primário do host local, diferente de 127.0.0.1
A solução deve funcionar pelo menos para Linux (Debian e RedHat) e OS X 10.7+
Estou ciente de que ifconfig
está disponível em ambos, mas sua saída não é tão consistente entre essas plataformas.
curl -4 ifconfig.co
. Ele responderá com o seu endereço IP4 externo.Respostas:
Use
grep
para filtrar o endereço IP deifconfig
:ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'
Ou com
sed
:ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'
Se você está interessado apenas em determinadas interfaces, wlan0, eth0, etc., então:
ifconfig wlan0 | ...
Você pode alternar o comando no seu
.bashrc
para criar seu próprio comando chamado,myip
por exemplo.alias myip="ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'"
Uma maneira muito mais simples é
hostname -I
(hostname -i
para versões mais antigas,hostname
mas ver comentários). No entanto, isso é apenas no Linux.fonte
-E
opção para Extended RE, não a-r
opção no estilo GNU .-E
. Versões recentes do FreeBSD adicionaram a-r
opção como um alias para-E
facilitar a portabilidade de scripts, mas a atualização ainda não foi trazida para o OSX, que pela última vez que verifiquei, ainda usa uma versão do sed de uma versão do FreeBSD de alguns anos atrás. Não sei exatamente qual, pois o OSX adotou o código-fonte do FreeBSD algumas vezes ao longo dos anos. Eu acredito que o uso de-E
se destinava a ser comparável aogrep
de-E
opção. Não faço ideia por que o pessoal do GNU optou por isso-r
.-E
para ter certeza de portabilidade, você acha que--help
eman pages
seria atualizado .. ele fez causar uma ligeira confusão para mim mais cedo em outra pergunta usando-E
O seguinte funcionará no Linux, mas não no OSX.
Isso não depende do DNS e funciona mesmo que
/etc/hosts
não esteja definido corretamente (1
é uma abreviação de1.0.0.0
):ou evitar
awk
e usar o DNS público do Google em8.8.8.8
óbvio:Uma maneira menos confiável: (veja o comentário abaixo)
fonte
hostname -I
não é confiável, porque (de acordo com a documentação) não é possível fazer suposições sobre a ordem dos endereços. Portanto, pode haver alguma rede interna (como a rede na qual as máquinas virtuais estão vivendo). O outro método parece bom.ip route get 1 | awk '{print $(NF-2);exit}'
funciona como I get uid anexado ao outptutip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p'
Para máquinas Linux (não OS X):
fonte
hostname -i
é a forma abreviada equivalentehostname
no GNU Coreutils versão 8.26.hostname -i
dá apenas o IP local, enquantohostname -I
dá todos os outros IPsno Linux
no macOS
hostname -I
pode retornar vários endereços em uma ordem não confiável (consulte a página dehostname
manual ), mas, para mim, apenas retorna192.168.1.X
, que é o que você queria.fonte
hostname -i
com um eu mais baixo.-i
bandeira diz o seguinte:Avoid using this option; use hostname -I instead
.Solução
Explicação
A maneira correta de consultar informações de rede está usando
ip
:-o
saída de uma linharoute get to
obter a rota real do kernel para um destino8.8.8.8
IP do Google, mas pode usar o IP real que você deseja alcançarpor exemplo,
ip
saída:Para extrair o
src
ip,sed
é o mais ligthest e mais compatível com o suporte a regex:-n
nenhuma saída por padrão's/pattern/replacement/p'
corresponder apenas ao padrão e substituir a impressão.*src \([0-9.]\+\).*
corresponda ao IP src usado pelo kernel, para alcançar8.8.8.8
por exemplo, saída final:
Outras respostas
Eu acho que nenhuma das respostas anteriores é boa o suficiente para mim, pois elas não funcionam em uma máquina recente (Gentoo 2018).
Problemas que encontrei nas respostas anteriores:
ifconfig
que está obsoleto e - por exemplo - não lista IPs múltiplos;awk
para uma tarefa simples com a qual o sed pode lidar melhor;ip route get 1
não é claro e é na verdade um alias paraip route get to 1.0.0.0
hostname
comando, que não tem-I
opção em todos os dispositivos e que retorna127.0.0.1
no meu caso.fonte
Editado (
01/06/2014 -09-01-2018)Para uma configuração mais forte, com muitas interfaces e muitos IP configurados em cada uma delas, escrevi um script bash puro (não baseado em
127.0.0.1
) para encontrar a interface e o ip corretos , com base emdefault route
. Eu posto este script na parte inferior desta resposta.Introdução
Como ambos os bater instalado por padrão, há uma dica do bash para Mac e Linux:
O problema de localidade é evitado pelo uso de
LANG=C
:Colocando isso em uma função:
Mínimo:
Uso simples:
Fantasia arrumada:
Uso:
ou, executando a mesma função, mas com um argumento:
Nota: Sem argumento, esta função gera STDOUT, o IP e uma nova linha , com um argumento, nada é impresso, mas uma variável chamada como argumento é criada e contém IP sem nova linha .
Nota2: Foi testado no Debian, LaCie hackeado nas e MaxOs. Se isso não funcionar no seu ambiente, ficarei muito interessado nos comentários!
Versão mais antiga desta resposta
(Não excluído porque com base em
sed
, nãobash
.)Aviso: Há um problema sobre localidades!
Rápido e pequeno:
Explodido (trabalho também;)
Editar:
Quão! Isso parece não funcionar no Mac OS ...
Ok, isso parece funcionar da mesma forma no Mac OS e no meu Linux :
dividido:
Meu script (jan 2018):
Este script primeiro encontrará a rota e a interface padrão usadas, depois procurará a rede local correspondente do gateway e preencherá as variáveis. As duas últimas linhas são impressas, algo como:
ou
Bem, aqui está:
fonte
sbin
não é no meu$PATH
fullpath tem de ser especificados, mas mesmo exist caminho no MacOS também :-).time
a escolha que você usaria tanto tempo ...Específico para apenas certas versões do Ubuntu. Embora possa apenas lhe dizer
127.0.0.1
:ou
fonte
$ hostname --ip-address
só me dá127.0.0.1
no Arch LinuxVocê também pode obter o endereço IP versão 4 do eth0 usando este comando no linux
A saída será assim
fonte
Isso funciona no Linux e OSX
Isso obterá a interface associada à rota padrão
Usando a interface descoberta acima, obtenha o endereço IP.
OSX
Darwin laptop 14.4.0 Kernel do Darwin versão 14.4.0: qui 28 de maio às 11:35:04 PDT 2015; raiz: xnu-2782.30.5 ~ 1 / RELEASE_X86_64 x86_64
en5
192.168.0.130
CentOS Linux
Linux dev-cil.medfx.local 2.6.18-164.el5xen 1 SMP qui 3 de setembro 04:03:03 EDT 2009 x86_64 x86_64 x86_64 GNU / Linux
eth0
192.168.46.10
fonte
| head -1
no final da primeira linha para obter a interface padrão, e o resto é bom.Usando alguns dos outros métodos Você pode entrar em conflito em que vários endereços IP são definidos no sistema. Essa linha sempre obtém o endereço IP por padrão usado.
fonte
Estou extraindo meu comentário para esta resposta:
Baseia-se na resposta @CollinAnderson, que não funcionou no meu caso.
fonte
fonte
bash
apelido:alias myip="ifconfig | grep 'inet ' | grep -v '127.0.0.1' | awk '{print \$2}'"
A maneira mais curta de obter o seu endereço IPv4 local no seu sistema Linux:
fonte
Supondo que você precise do seu IP público primário , visto do resto do mundo, tente um destes:
fonte
Eu tenho que acrescentar à resposta de Collin Andersons que esse método também leva em consideração se você tiver duas interfaces e as duas aparecerem como exibidas.
Eu tenho trabalhado em um aplicativo com Raspberry Pi e precisava do endereço IP que realmente estava sendo usado, não apenas se estava ativo ou não. A maioria das outras respostas retornará os dois endereços IP, o que não é necessariamente útil - para o meu cenário de qualquer maneira.
fonte
IP da interface de rede primária
fonte
Localiza um endereço IP deste computador em uma rede que é um gateway padrão (por exemplo, exclui todas as redes virtuais, pontes de encaixe), por exemplo. gateway de internet, gateway wifi, ethernet
Funciona no Linux.
Teste:
fonte
fonte
Outra
ifconfig
variação que funciona tanto no Linux quanto no OSX:fonte
ifconfig | grep '\<inet\>' | cut -d ' ' -f2 | grep -v '127.0.0.1'
Passei por muitos links (StackExchange, AskUbuntu, StackOverflow, etc.) e tomei a decisão de combinar todas as melhores soluções em um único script de shell.
Na minha opinião, esses dois QAs são os melhores vistos:
Como posso obter meu endereço IP externo em um script de shell? https://unix.stackexchange.com/q/22615
Como encontro meu endereço IP interno? https://askubuntu.com/a/604691
Aqui está minha solução com base em algumas idéias de rsp compartilhadas em seu repositório ( https://github.com/rsp/scripts/ ).
Alguns de vocês podem dizer que esse script é extremamente grande para tarefas tão simples, mas eu gostaria de torná-lo o mais fácil e flexível possível. Ele suporta arquivo de configuração simples, permitindo redefinir os valores padrão.
Foi testado com sucesso sob Cygwin, MINGW e Linux (Red Hat).
Mostrar endereço IP interno
Mostrar endereço IP externo
Código-fonte, também disponível no link: https://github.com/ildar-shaimordanov/tea-set/blob/master/home/bin/myip . Existe um exemplo de arquivo de configuração, próximo ao script principal.
fonte
Utilizo apenas nomes de interface de rede , meu comando personalizado é
no meu próprio caderno
mas se a interface de rede possuir pelo menos um ip, mostrará todos os ip pertencentes a ele
por exemplo
Ubuntu 16.10
Debian Jessie
CentOS 6.8
Fedora 24
Parece que o comando
ip route get 1 | awk '{print $NF;exit}'
fornecido pelo link é mais preciso, além do mais, é mais curto.fonte
Não tenho certeza se isso funciona em todos os sistemas operacionais, experimente.
fonte
ip route get 1 | awk '{print $NF;exit}'
. Deve funcionar na maioria dos sistemas.ip route get 1 | awk '{print $NF;exit}'
funcionaHá um pacote de nós para tudo. É multiplataforma e fácil de usar.
Essa é uma abordagem controversa, mas o uso do npm para ferramentas está se tornando mais popular, goste ou não.
fonte
Se você conhece a interface de rede (eth0, wlan, tun0 etc):
fonte
fonte
fonte
Funciona em Mac, Linux e dentro de Docker Containers:
$ hostname --ip-address 2> /dev/null || (ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p' | awk '{print
$ 1; Saída}')Também funciona
Makefile
como:LOCAL_HOST := ${shell hostname --ip-address 2> /dev/null || (ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p' | awk '{print $1; exit}')}
fonte
hostname --ip-address
=>hostname: illegal option -- -
no MacOS SierraPara o Linux, o que você precisa é este comando:
digite isso no seu shell e você simplesmente conhecerá o seu ip.
fonte
É mais fácil de ler:
ifconfig | grep 'inet addr:' |/usr/bin/awk '{print $2}' | tr -d addr:
fonte
Se você possui
npm
enode
instalou:npm install -g ip && node -e "const ip = require('ip'); console.log(ip.address())"
fonte