Como obter o endereço IP usando o script de shell? [duplicar]

Esta pergunta já tem respostas aqui :

Comentários

  • Isn ' t ifconfig -a o que você ' está procurando?
  • @rajcoumar Não consigo ver por que usar um IP privado o proíbe de usar a saída de ifconfig -a. Na verdade, a resposta que você marcou como aceita faz exatamente isso (usa apenas ip em vez de ifconfig).
  • ip -4 route get 8.8.8.8 | awk {'print $7'} | tr -d '\n'
  • MY_IP=$(getent hosts $(hostname) | awk '{print $1}')

Resposta

Para listar todos os endereços IP, independentemente do nome, tente isto:

ifconfig | perl -nle "s/dr:(\S+)/print $1/e" 

ou:

ifconfig | awk "/inet addr/{print substr($2,6)}" 

Especifique o nome da interface (por exemplo, eth0) logo após ifconfig se desejar apenas o IP de uma interface específica:

ifconfig eth0 | perl -nle "s/dr:(\S+)/print $1/e" 

ou:

ifconfig eth0 | awk "/inet addr/{print substr($2,6)}" 

Comentários

  • obrigado, esta é minha saída 192.168.56.102 10.192.1.218 10.0.2.15 127.0.0.1, agora eu quero pegar 10.192.1.218 e atribuir em uma nova variável no script de shell. como podemos fazer?
  • isso apenas exibiria os endereços IP .. seria melhor se os nomes de interface correspondentes como eth0, eth1, … também são exibidos. 🙂
  • Use absolutamente as tabelas de roteamento como @ymattw sugere! Isso tem a maravilhosa propriedade de retornar exatamente o endereço pelo qual seu computador está configurado para falar com o endereço fornecido. Eu acho que você provavelmente deseja awk '{print $NF; exit}', no entanto, obter o último campo (endereço de origem) da primeira linha.
  • Obrigado por apontar, parece ser o último a edição não foi ' salva. Interessante, eu não poderia ' editar minha própria resposta, então apenas reenviar: ip route get 1.1.1.1 | awk '{print $NF; exit} # isto obtém o ip da interface que pode alcançar fora

Resposta

Você pode fazer:

ip addr | grep "state UP" -A2 | tail -n1 | awk "{print $2}" | cut -f1 -d"/"

que fornece o primeiro endereço IP privado listado em ip addr.

Por exemplo, com ip addr, obtenho:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: em1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:16:76:de:c1:f1 brd ff:ff:ff:ff:ff:ff inet 192.168.0.85/24 brd 192.168.0.255 scope global dynamic em1 valid_lft 42505sec preferred_lft 42505sec inet6 fe80::216:76ff:fede:c1f1/64 scope link valid_lft forever preferred_lft forever 3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 52:54:00:da:92:d0 brd ff:ff:ff:ff:ff:ff inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0 valid_lft forever preferred_lft forever 4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 500 link/ether 52:54:00:da:92:d0 brd ff:ff:ff:ff:ff:ff 

Com a linha de comando anterior, obtenho 192.168.0.85 que é o endereço IP de em1.

Para colocá-la em uma variável dentro de um script de shell, você pode fazer var=$(ip addr | grep "state UP" -A2 | tail -n1 | awk "{print $2}" | cut -f1 -d"/"). Agora, até o final do script, $var terá o valor do endereço IP.

Comentários

  • E, de fato, é ' muito semelhante a unix.stackexchange.com/questions/8518/… . Não procurei duplicatas antes de postar …
  • ip addr | grep ' estado UP ' -A2 | tail -n1 | awk ' {print $ 2} ' | cut -f1 -d ' / ' usando este comando, obtive um endereço privado. Agora quero atribuir a saída a uma variável
  • @rajcoumar Atualizei a resposta. Observe que essa pergunta já foi feita e respondida neste site. Consulte unix.stackexchange.com/questions/4569/… para obter detalhes.
  • Observação também que minha resposta não é das mais elegantes. Pode haver uma maneira melhor de fazer isso do que analisar a saída de ip addr.
  • ip addr | grep 'state UP' -A2 | tail -n1 | awk -F'[/ ]+' '{print $3}' isso também funciona, a propósito

Resposta

Copiar e colar flagrante de stackoverflow já que não podemos “enganar” os sites. Eu sei que não é bash ou sh, mas quem não tem o python instalado neste momento?

Você deve usar netifaces . Foi projetado para ser multiplataforma no Mac   OS   X, Linux e Windows.

>>> import netifaces as ni >>> ni.interfaces() ["lo", "eth0", "eth1", "vboxnet0", "dummy1"] >>> ni.ifaddresses("eth0") {17: [{"broadcast": "ff:ff:ff:ff:ff:ff", "addr": "00:02:55:7b:b2:f6"}], 2: [{"broadcast": "24.19.161.7", "netmask": "255.255.255.248", "addr": "24.19.161.6"}], 10: [{"netmask": "ffff:ffff:ffff:ffff::", "addr": "fe80::202:55ff:fe7b:b2f6%eth0"}]} >>> >>> ni.ifaddresses.__doc__ "Obtain information about the specified network interface.\n\nReturns a dict whose keys are equal to the address family constants,\ne.g. netifaces.AF_INET, and whose values are a list of addresses in\nthat family that are attached to the network interface." >>> # for the IPv4 address of eth0 >>> ni.ifaddresses("eth0")[2][0]["addr"] "24.19.161.6" 

Os números usados para indexar protocolos são de /usr/include/linux/socket.h (no Linux) …

#define AF_INET 2 /* Internet IP Protocol */ #define AF_INET6 10 /* IP version 6 */ #define AF_PACKET 17 /* Packet family */ 

Fim de copiar e colar

Se tudo que você quer é o IP do up e interface de saída, isso funciona.

Ainda outra opção se você quiser apenas enumerar as interfaces, já que ninguém parece ser capaz de compreender e exatamente o que você deseja:

import netifaces as ni ints = ni.interfaces() for i in ints: if "eth" in i: try: ni.ifaddresses(i)[2][0]["addr"] print("interface: " + i) print("address: " + ni.ifaddresses(i)[2][0]["addr"]) except: pass elif "wlan" in i: try: ni.ifaddresses(i)[2][0]["addr"] print("interface: " + i) print("address: " + ni.ifaddresses(i)[2][0]["addr"]) except: pass 

Comentários

  • Observe que o OP declarou em sua pergunta que ele não ' não sabe com antecedência qual interface está ACIMA.Ele apenas deseja o endereço IP da interface no estado " up " sem saber qual é.
  • Em seguida, ' está apenas obtendo o endereço local de um soquete aberto para o Google. Da forma como eu li, ele queria enumerar todas as interfaces e mapear IPs para interfaces em vez de apenas abrir um soquete e procurar o IP local.
  • Adicionou um script simples para endereçar o " apenas me dê o IP de saída " problema.
  • Ele não ' t deseja seu endereço externo , mas seu endereço privado. Pelo que entendi, ele poderia estar conectado a uma rede privada por qualquer uma de suas interfaces e só quer saber seu endereço IP privado sem saber qual interface é usada.
  • O endereço privado ainda seria fornecido por o segundo script, é ' é apenas o endereço privado de saída.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *