Comando Shell para obter endereço IP?

24

Existe um comando bash para encontrar o endereço IP de uma caixa Ubuntu? Preciso encontrar o endereço IP para poder ssh na máquina mais tarde.

feroz
fonte

Respostas:

32

/sbin/ifconfig -a

mpbloch
fonte
Sim, e se você está pensando em administrar remotamente o servidor, vi /etc/network/interfacese definir a interface para static(ver help.ubuntu.com/8.10/serverguide/C/network-configuration.html )
gravyface
A execução deste comando revela uma lista completa de números. Qual devemos usar? O inet addr?
ComputerScientist
25

Você pode usar:

/bin/ip addr
Robert Swisher
fonte
3
@opierce Você marcou a resposta do mpbloch como correta, mas como FYI, você deve usar essa resposta, pois isso faz parte do pacote iproute2. ifconfigestá sendo faseado agora.
jwbensley
3
Você pode tornar isso mais curto apenas executando ip a.
gak
19

Se você tiver um endereço interno em uso, marque

curl http://myip.dnsomatic.com

pode ser uma boa idéia para os shell do Unix.
Ou simplesmente insira esse URL no seu navegador.


Se você receber uma resposta diferente do " ifconfig -a" resultado,
o ifconfigseu endereço interno foi fornecido - o que provavelmente não funcionará de fora.


Mesmo que tudo pareça bem, você pode ter um firewall que desaprova as conexões ssh recebidas .
Nesse momento, você deve experimentar a porta de interesse de um navegador na máquina em,

http://www.canyouseeme.org/

Isso confirmará a conectividade por meio de,

  • endereço IP externo (mostrando para você nessa página)
  • NAT, Port Forward
  • Firewalls
nik
fonte
Verdade, mas se for esse o caso, provavelmente não há regras de NAT / Port Forwarding para corresponder ssh a qualquer que seja o IP interno.
Kyle Brandt
@Kyle, que pode ser adicionado ...
nik
3
+1 paracurl http://myip.dnsomatic.com
JatSing
Semelhante a isso, há tambémcurl ifconfig.me
jwbensley 19/06/2013
19

/bin/hostname -i

James
fonte
3
Nesse caso, eu sugeriria usar hostname --all-ip-addresses. Exibir todos os endereços de rede do host. Esta opção enumera todos os endereços configurados em todas as interfaces de rede. A interface de loopback e os endereços locais de link IPv6 são omitidos. Ao contrário da opção -i, essa opção não depende da resolução de nomes. Não faça suposições sobre a ordem da saída.
Lrkwz
5
Shorter alternativa ao @ lrkwz do comentário/bin/hostname -I
hanxue
Obrigado @hanxue - isso deve ser uma resposta própria - o comando mais curto com a saída mais limpa - exatamente o que eu estava procurando! Na minha experiência (Ubuntu), /bin/hostname -iapenas dá 127.0.1.1, o que é inútil.
precisa
9
/sbin/ifconfig|grep inet|head -1|sed 's/\:/ /'|awk '{print $3}'

Se você precisar do seu endereço interno, anexe sua interface após o ifconfig, por exemplo

 /sbin/ifconfig eth0|grep inet|head -1|sed 's/\:/ /'|awk '{print $3}'
Johan
fonte
+1, é exatamente isso que eu precisava para resolver um problema. Viva para one-liners!
J. Polfer
+1 Sem a cabeça -1: / sbin / ifconfig | grep inet | sed 's / \: / /' | awk 'NR == 1 {print $ 3}'
joeslice
Obrigado, funciona no Debian, mas no OS X não funciona, retornando algum lixo. Seria ótimo se pudéssemos criar uma linha que funcione em ambos. Aqui é a saída do ifconfig no OS X: gist.github.com/ssbarnea/5814657
Sorin
3

Se você precisar descobrir qual é o endereço IP do seu roteador, poderá executar este comando.

dig + short myip.opendns.com @ 208.67.222.222 @ 208.67.220.220

Se você estiver usando o OpenDNS para o seu servidor DNS, poderá reduzi-lo para:

dig + short myip.opendns.com

Você também pode usar este comando.

curl http://myip.dnsomatic.com
Brad Gilbert
fonte
3

Se você possui várias interfaces, pode ser útil especificar qual você deseja IP. se você deseja o endereço IPV4 da interface 'eth0':

ip addr show dev eth0 | grep "inet " | awk '{ print $2 }' 

se você deseja o endereço IPV6 da interface 'eth0':

ip addr show dev eth0 | grep "inet6 " | awk '{ print $2 }' 

se você deseja procurar um IP entre duas interfaces comuns de um laptop, wlan0 e eth0:

CURRENT_IP=''
for INTERFACE in wlan0 eth0; do
    if [ -z $CURRENT_IP ]; then
        CURRENT_IP=$(ip addr show dev $INTERFACE | grep "inet " | awk '{ print $2 }')
    fi
done
LoreLLo
fonte
3

Apenas enrole esta página :

$ curl wtfismyip.com/text

mansi
fonte
E como exatamente isso é superior aos serviços similares já mencionados durante esses anos?
Esa Jokinen 29/03
2

Aqui está uma linha que também funciona no Linux e OS X e retornará o primeiro endereço que não é local:

ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'

Enviar créditos para /programming//a/13322549/99834

sorin
fonte
2
LOCAL_IP=`/bin/hostname -I | sed 's/ //g'`
Mohammed Saqib Rajput
fonte
1

A maneira mais simples de fazer isso é provavelmente

ifconfig eth0

supondo que a máquina tenha um único endereço IP na interface com fio padrão - você pode precisar

ifconfig wlan0

se estiver em WiFi.

David North
fonte
1
ip address show scope link

Ele mostrará o endereço IP das interfaces de vida - tem link -. Mas não é um comando bash. O Bash não tem nenhuma capacidade de saber sobre IP e rede.

Saabi
fonte
1

O que eu entendo é que você deseja conectar uma máquina ubuntu remota com ip dinâmico. Acesse o site dyndns.org e abra uma conta gratuita. Em seguida, na máquina remota, você precisa instalar uma ferramenta ip dinâmica.

sudo aptitude install dyndns-client

para que você possa ssh máquina remota via

ssh username@yourdynamicnamealias.dyndns.org

Portanto, após a configuração, você nunca precisará do endereço IP da máquina remota.

homem chuva
fonte
Este é o meu método preferido para lidar com IPs dinâmicos. O dyndns.org é um serviço fantástico e gratuito.
John Barrett
1

Aqui está o que eu estou usando:

LC_ALL=C /sbin/ifconfig | awk '
    /inet addr/ {
        gsub("addr:","");
        if(($2!="127.0.0.1") && ($2!="0.0.0.0") && ($2!=""))
            { print $2 };
    }'
jlliagre
fonte
1

se você precisar de apenas um IP da interface fornecida, poderá:

ifconfig eth0 | grep "inet " | awk '{gsub("addr:","",$2);  print $2 }' 
DmitrySemenov
fonte
0

Se você estiver procurando por um endereço IP público da caixa , use o seguinte:

  • dig @ns1.google.com -t txt o-o.myaddr.l.google.com +short | tr -d \"

Você pode usar dig(1)opções como -4ou -6procurar especificamente um endereço IPv4 ou IPv6; O Google fornecerá uma resposta em um registro do TXTtipo, que terá aspas quando apresentado pordig ; se você quiser usar a variável posteriormente com utilitários como traceroute, você deve usar algo como tr (1) para remover as citações.

Outras opções incluem whoami.akamai.nete myip.opendns.com, que respondem com Ae AAAAregistros (em vez de TXTno exemplo acima do Google), portanto, não exigem a remoção das aspas:

  • dig -4 @ns1-1.akamaitech.net -t a whoami.akamai.net +short

  • dig -4 @resolver1.opendns.com -t any myip.opendns.com +short

  • dig -6 @resolver1.opendns.com -t any myip.opendns.com +short

Aqui está um exemplo de script que usa todas as opções acima para definir as variáveis:

#!/bin/sh
IPANY="$(dig @ns1.google.com -t txt o-o.myaddr.l.google.com +short | tr -d \")"
GOOGv4="$(dig -4 @ns1.google.com -t txt o-o.myaddr.l.google.com +short | tr -d \")"
GOOGv6="$(dig -6 @ns1.google.com -t txt o-o.myaddr.l.google.com +short | tr -d \")"
AKAMv4="$(dig -4 @ns1-1.akamaitech.net -t a whoami.akamai.net +short)"
CSCOv4="$(dig -4 @resolver1.opendns.com -t a myip.opendns.com +short)"
CSCOv6="$(dig -6 @resolver1.opendns.com -t aaaa myip.opendns.com +short)"
printf '$GOOG:\t%s\t%s\t%s\n' "${IPANY}" "${GOOGv4}" "${GOOGv6}"
printf '$AKAM:\t%s\n$CSCO:\t%s\t%s\n' "${AKAMv4}" "${CSCOv4}" "${CSCOv6}"

Se você estiver procurando por um endereço IP privado ou por um conjunto de todos os endereços IP atribuídos à caixa, poderá usar uma combinação de ifconfig(no BSD e GNU / Linux), ip addr(no GNU / Linux), hostname(opções -ie -Iem GNU / Linux) e netstatpara ver o que está acontecendo.

cnst
fonte