Como uma instância do Linux determina seu endereço IP?
Ou seja, não o 127.0.0.1.
Isso é armazenado em arquivo ou o ifconfig calcula de alguma forma a cada chamada?
Consegui resolver só para mostrar que fiz um esforço, mas não é nada que eu colocaria em uma aplicação séria:
sudo ifconfig | head -n 2 | tail -n 1 | tr -s " " | tr " " ":" | cut -d":" -f 4
Responder1
Existem falhas fundamentais em sua pergunta. Em primeiro lugar, os hosts podem (e provavelmente terão) mais de um endereço (por exemplo, múltiplas interfaces) e até mais de um endereço por interface. Este é um problema ainda maior com o IPv6, onde cada host conectado globalmente tem pelo menosdoisendereços.
Em segundo lugar, a "melhor" maneira de fazer isso a partir de um shell varia de sistema para sistema.
Linux:
/sbin/ip addr show eth0 | awk -F"[ /]+" '/inet / {print $3}'
>= Solaris 11:
ipadm show-addr net0/v4 | awk -F"[ /]+" '/ok/ {print $5}'
Mac OS X/Darwin:
ipconfig getifaddr en0
Mesmo o menor denominador comum e o uso ifconfig
não serão consistentes porque o formato de saída pode mudar. No entanto, para limpar seu exemplo, use isto:
ifconfig eth0 | awk -F"[ :]+" '/inet / {print $4}'
Se você estiver usando uma linguagem mais sofisticada como perl, ruby, java, etc., em vez do shell, cada linguagem terá sua própria maneira de obter esses dados do kernel. Vou deixar isso para você.
Responder2
As informações podem mudar a qualquer momento, por isso precisam ser recuperadas do kernel, não podem ser armazenadas em um arquivo.
Não existe uma maneira realmente agradável de obter essas informações. Sua análise é tão boa quanto qualquer outra, exceto que a codificação da segunda linha está errada: não há garantia de que as interfaces serão listadas em qualquer ordem específica. É bastante comum que uma máquina tenha mais de uma interface: você pode ter várias placas de rede ou interfaces virtuais.
Freqüentemente, o endereço IP de seu interesse é aquele associado à rota padrão. Com a maioria das configurações, você pode obter a interface correta com o route
comando e, em seguida, extrair o endereço IP dessa interface com ifconfig
.
/sbin/ifconfig $(/sbin/route -n |
awk '$1 == "0.0.0.0" {print $8}') |
awk 'match($0, /inet addr:[.0-9]+/) {print substr($0, RSTART+10, RLENGTH-10)}'
Observe que não há necessidade de ligar sudo
. ifconfig
e route
muitas vezes não estão no padrão PATH
para usuários não-root, mas você pode usá-los sem privilégios especiais, desde que esteja apenas lendo as informações e não alterando as configurações.
Em variantes Unix diferentes do Linux, pode ser necessário ajustar os comandos acima. A maioria possui comandos chamados ifconfig
e route
, mas o formato de saída pode ser diferente.
No Linux, em vez de ifconfig
e route
, você pode usar o ip
comando doiproute2conjunto de ferramentas. Embora os autores do iproute2 considerem ifconfig
e route
sejam obsoletos, na verdade há pouca vantagem em usar ip
, uma vez que a saída de ip
não é muito mais fácil de analisar e ifconfig
está route
sempre disponível, enquanto algumas instalações simplificadas do Linux omitem ip
.
Responder3
Todas as respostas aqui são tecnicamente corretas, mas não são o que eu consideraria a resposta "certa". Infelizmente, sua pergunta é extremamente vaga (o que posso entender se você não for muito bom em como funciona a rede no Linux), então darei algumas respostas para possíveis interpretações da pergunta.
O IP principal da máquina
A máquina possui um IP acima de todos os outros, que é considerado o IP principal da máquina. Observe, porém, que isso não tem sentido, já que uma caixa pode ter vários IPs e qual deles é usado varia (falarei disso em breve).
O IP primário é simplesmente o IP associado ao nome do host da máquina. Você pode encontrar esse IP executando o seguinte
getent hosts "$(hostname)" | awk '{ print $1 }'
Agora, o que isso faz é procurar o IP do nome do host da máquina de acordo com /etc/nsswitch.conf
. Na maioria dos casos, o /etc/nsswitch.conf
arquivo contém hosts: files dns
. Isso significa que ao tentar fazer qualquer tipo de pesquisa de nome de host ou endereço, ele irá procurar /etc/hosts
primeiro e depois consultar o DNS (conforme configurado por /etc/resolv.conf
).
Portanto, o comando getent hosts "$(hostname)"
provavelmente irá capturar a entrada correspondente de /etc/hosts
. Simplesmente awk
pega apenas o IP dessa linha.
( getent
é apenas um utilitário simples para consultar 'bancos de dados' listados em /etc/nsswitch.conf
)
O IP usado para se comunicar com o mundo exterior
Como mencionei anteriormente, o IP principal da máquina não tem sentido. A máquina pode usar qualquer um dos vários IPs para comunicação. No seu caso, você provavelmente tem apenas uma interface e um IP (não localhost). No entanto, um servidor pode ter múltiplas interfaces ou IPs (às vezes vários IPs em uma única interface).
Qual IP será usado é determinado pela tabela de roteamento do kernel. Não vou entrar em detalhes sobre como a tabela de roteamento funciona, pois não é simples (há várias tabelas de roteamento e qual delas é usada depende das regras de seleção de tabelas). Vou apenas dizer como descobrir qual IP seria usado.
Para saber qual IP será utilizado para se comunicar com um destino específico, utilize o seguinte comando:
ip route get 1.2.3.4
( 1.2.3.4
sendo o IP do destino)
Na minha máquina, se eu fizer isso com um dos IPs do google.com ( 74.125.139.102
), recebo o seguinte:
74.125.139.102 via 192.168.0.1 dev wlan0 src 192.168.0.24
cache
O que isso me diz é que o IP 192.168.0.24
será usado sempre que minha máquina for conversar 74.125.139.102
.
Se você quiser apenas o IP, basta adicionar um extra grep
no final.
ip route get 1.2.3.4 | grep -oP '(?<=src )\S+'
grep
é usado em vez de an awk
porque é menos sujeito a erros. É possível que a linha mude e o IP não fique no mesmo lugar, mas sempre seguirá "src", então apenas pegamos o valor imediatamente após "src"
IP do gateway padrão
Por último, há o gateway padrão. Se você não tiver um destino específico para consultar qual IP será usado, você pode escolher aquele no gateway padrão. Se você tiver apenas uma interface, isso é tudo que importa.
Isso é basicamente a mesma coisa acima, apenas usando o gateway padrão como nosso destino para procurar
ip route get "$(ip route show to 0/0 | grep -oP '(?<=via )\S+')"
Isso lhe dará uma linha como a da seção acima. O src
valor é o IP que será usado para o tráfego que flui pelo gateway padrão.
Como na seção anterior, para obter apenas o IP, adicione um arquivo grep
.
ip route get "$(ip route show to 0/0 | grep -oP '(?<=via )\S+')" | grep -oP '(?<=src )\S+'
Responder4
Sua solicitação é ambígua, geralmente com a palavra "localhost" as pessoas se referem à interface de loopback e 127.0.0.1 é a resposta mais comum e correta.
O que você está perdendo é:
- o fato de que cada interface pode ter um IP diferente, a interface de loopback é uma interface de rede como sua placa Ethernet ou seu receptor USB sem fio.
- como consequência, um único PC não possui um único IP, tudo depende de qual interface você está considerando e quantas interfaces você está usando no seu sistema operacional.
Você provavelmente está interessado no tópico "Tabelas de roteamento do kernel", que é uma boa maneira de começar a entender como o kernel lida com sua atividade de rede.