IP do localhost

5

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 de alguma forma o calcula a cada invocação?

Consegui resolvê-lo apenas para mostrar que fiz um esforço, mas não é nada que eu colocaria em um aplicativo sério:

sudo ifconfig | head -n 2 | tail -n 1 | tr -s " " | tr " " ":" | cut -d":" -f 4
    
por Emanuel Berg 03.07.2012 / 00:38

4 respostas

4

A informação pode mudar a qualquer momento, então ela precisa ser recuperada do kernel, não pode ser armazenada em um arquivo.

Não há uma maneira legal de obter essas informações. Sua análise é tão boa quanto qualquer outra, exceto que a codificação rígida 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.

Geralmente, o endereço IP do seu interesse é aquele associado à rota padrão. Com a maioria das configurações, você pode obter a interface correta com o comando route e 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)}'

Note que não há necessidade de chamar sudo . ifconfig e route geralmente não estão no padrão PATH para usuários não-root, mas você pode usá-los sem privilégios especiais contanto que esteja apenas lendo informações e não alterando as configurações.

Em variantes unix diferentes do Linux, você pode ter que ajustar os comandos acima. A maioria tem 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 comando ip do iproute2 conjunto de ferramentas. Embora os autores do iproute2 considerem que ifconfig e route sejam preteridos, de fato há pouca vantagem em usar ip , pois a saída de ip não é mais fácil de analisar e ifconfig e route estão sempre disponíveis, enquanto algumas instalações do Linux simplificadas omitem ip .

    
por 03.07.2012 / 01:03
7

Existem falhas fundamentais na sua pergunta. Em primeiro lugar, os hosts podem (e provavelmente terão) mais de um endereço (por exemplo, várias interfaces) e até mais de um endereço por interface. Isso é ainda mais um problema com o IPv6, onde cada host conectado globalmente tem pelo menos dois endereç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 indo menor denominador comum e usando ifconfig não será consistente 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 idioma terá seu próprio modo de obter esses dados do kernel. Vou deixar de descobrir isso para você.

    
por 03.07.2012 / 01:05
5

Todas as respostas aqui estão tecnicamente corretas, mas não são o que eu consideraria a resposta "certa". Infelizmente, sua pergunta é extremamente vaga (o que eu posso entender se você não é muito bom com o funcionamento da rede no Linux), então eu darei algumas respostas para possíveis interpretações da questão.


IP primário da máquina

A máquina tem um IP acima de todos os outros, que é considerado o IP primário da máquina. Note, entretanto, que isso é bastante insignificante, já que uma caixa pode ter vários IPs e qual deles é usada varia (vou falar disso daqui a pouco).

O IP primário é simplesmente o IP associado ao nome do host da máquina. Você pode encontrar este 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 arquivo /etc/nsswitch.conf contém hosts: files dns . Isso significa que, ao tentar fazer qualquer tipo de pesquisa de nome de host ou endereço, ele procurará /etc/hosts primeiro e, em seguida, consultará o DNS (conforme configurado por /etc/resolv.conf ).
Portanto, o comando getent hosts "$(hostname)" provavelmente irá pegar a entrada correspondente de /etc/hosts . O awk simplesmente 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 primário da máquina é bastante insignificante. A máquina pode usar 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 várias interfaces ou IPs (às vezes vários IPs em uma única interface). Qual IP é usado é determinado pela tabela de roteamento do kernel. Não vou entrar nos detalhes de 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 tabela). Vou apenas dizer-lhe como encontrar qual IP seria usado.

Para descobrir qual IP será usado para se comunicar com um destino específico, use o seguinte comando:

ip route get 1.2.3.4

(com 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 ), obtenho 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 falar com 74.125.139.102 .

Se você quer apenas o IP, você pode simplesmente jogar um grep extra no final.

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

grep é usado em vez de um awk porque é menos propenso a erros. É possível que a linha possa mudar na qual o IP não estará no mesmo lugar, mas sempre seguirá "src", então pegamos o valor imediatamente após "src"


IP do gateway padrão

Por fim, há o gateway padrão. Se você não tiver um destino específico para consultar para ver qual IP será usado, poderá escolher aquele do gateway padrão. Se você tem apenas uma interface, isso é tudo o que importa, de qualquer maneira.
Isso é basicamente a mesma coisa que 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 valor src é 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 grep .

ip route get "$(ip route show to 0/0 | grep -oP '(?<=via )\S+')" | grep -oP '(?<=src )\S+'
    
por 01.09.2012 / 04:00
1

Sua solicitação é ambígua, geralmente com a palavra "localhost" significa que a interface de loopback e 127.0.0.1 é a resposta mais comum e correta.

O que você está perdendo é:

  • o fato de que toda interface pode ter um IP diferente, a interface de loopback é uma interface de rede exatamente como sua placa ethernet ou seu receptor usb sem fio.
  • como conseqüência, um único PC não tem um único IP, tudo depende de qual interface você está considerando e quantas interfaces você está usando sob seu SO.

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.

    
por 03.07.2012 / 00:56

Tags