IP do host local

IP do host local

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 ifconfignã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 routecomando 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. ifconfige routemuitas vezes não estão no padrão PATHpara 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 ifconfige route, mas o formato de saída pode ser diferente.

No Linux, em vez de ifconfige route, você pode usar o ipcomando doiproute2conjunto de ferramentas. Embora os autores do iproute2 considerem ifconfige routesejam obsoletos, na verdade há pouca vantagem em usar ip, uma vez que a saída de ipnão é muito mais fácil de analisar e ifconfigestá routesempre 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.confarquivo 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/hostsprimeiro 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 awkpega 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.4sendo 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.24será usado sempre que minha máquina for conversar 74.125.139.102.

Se você quiser apenas o IP, basta adicionar um extra grepno final.

ip route get 1.2.3.4 | grep -oP '(?<=src )\S+'

grepé usado em vez de an awkporque é 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 srcvalor é 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.

informação relacionada