Como obter o endereço IP principal da máquina local no Linux e OS X? [fechadas]


338

Estou procurando uma solução de linha de comando que me retorne o (primeiro) endereço IP primário do host local, diferente de 127.0.0.1

A solução deve funcionar pelo menos para Linux (Debian e RedHat) e OS X 10.7+

Estou ciente de que ifconfigestá disponível em ambos, mas sua saída não é tão consistente entre essas plataformas.


2
Você quer apenas o IP da rede local da sua máquina? 192.168.0.12
Chris Seymour

Sim, o IP local, primeiro como ele pode ter mais de um, mas eu poderia viver mesmo com uma lista. No momento, estou feliz em oferecer suporte apenas a endereços IPv4 e ignorar o IPv6, pois ele deseja gerar apenas um hash.
Sorin

2
Como você define "primário"? Se você está pensando "no endereço IP que está na mesma sub-rede que minha rota padrão", precisará programar um pouco para isso. Mas e se a máquina não tiver uma rota padrão, mas ainda tiver mais de 1 endereço IP?
ghoti

4
Tente curl -4 ifconfig.co. Ele responderá com o seu endereço IP4 externo.
asmaier 6/08/19

Respostas:


475

Use greppara filtrar o endereço IP de ifconfig:

ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'

Ou com sed:

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

Se você está interessado apenas em determinadas interfaces, wlan0, eth0, etc., então:

ifconfig wlan0 | ...

Você pode alternar o comando no seu .bashrcpara criar seu próprio comando chamado, myippor exemplo.

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

Uma maneira muito mais simples é hostname -I( hostname -ipara versões mais antigas, hostnamemas ver comentários). No entanto, isso é apenas no Linux.


5
Observe também que no OSX, o sed usa a -Eopção para Extended RE, não a -ropção no estilo GNU .
ghoti

11
Interessante; Eu não percebi que o GNU sed era suportado -E. Versões recentes do FreeBSD adicionaram a -ropção como um alias para -Efacilitar a portabilidade de scripts, mas a atualização ainda não foi trazida para o OSX, que pela última vez que verifiquei, ainda usa uma versão do sed de uma versão do FreeBSD de alguns anos atrás. Não sei exatamente qual, pois o OSX adotou o código-fonte do FreeBSD algumas vezes ao longo dos anos. Eu acredito que o uso de -Ese destinava a ser comparável ao grepde -Eopção. Não faço ideia por que o pessoal do GNU optou por isso -r.
ghoti 10/11/12

11
@ghoti eu mudei de resposta para usar -Epara ter certeza de portabilidade, você acha que --helpe man pagesseria atualizado .. ele fez causar uma ligeira confusão para mim mais cedo em outra pergunta usando-E
Chris Seymour

11
Eu encontrei um problema, enquanto isso funciona no OS X, ele retorna mais de um IP, uma lista de IPs. Parece que o primeiro é o caminho certo, mas ainda assim isso quebraria minha lógica. Veja gist.github.com/ssbarnea/31b9dcb0f8fd528b958c - ele também retorna os vnic que estão ativos, mas usados ​​por paralelos.
sorin

13
OSX: ipconfig getifaddr en0
parleer 16/11/2015

232

O seguinte funcionará no Linux, mas não no OSX.

Isso não depende do DNS e funciona mesmo que /etc/hostsnão esteja definido corretamente ( 1é uma abreviação de 1.0.0.0):

ip route get 1 | awk '{print $NF;exit}'

ou evitar awke usar o DNS público do Google em 8.8.8.8óbvio:

ip route get 8.8.8.8 | head -1 | cut -d' ' -f8

Uma maneira menos confiável: (veja o comentário abaixo)

hostname -I | cut -d' ' -f1

8
O método que obtém o primeiro endereço produzido pelo hostname -Inão é confiável, porque (de acordo com a documentação) não é possível fazer suposições sobre a ordem dos endereços. Portanto, pode haver alguma rede interna (como a rede na qual as máquinas virtuais estão vivendo). O outro método parece bom.
Adam Ryczkowski 23/09

3
Essa deve ser a resposta aceita, pois o RHEL 7 não inclui mais o ifconfig.
18716 Andrew

10
Para mim ip route get 1 | awk '{print $(NF-2);exit}'funciona como I get uid anexado ao outptut
Hritik

13
ESTA (a primeira) É A ÚNICA SOLUÇÃO CORRETA . É importante ler o IP especificamente da interface associada à rota padrão. Caso contrário, é provável que você obtenha algum endereço interno sem valor.
Jan Hudec

12
não funcionou para mim, mas foi fechado o suficiente:ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p'
estani

230

Para máquinas Linux (não OS X):

hostname --ip-address

10
Isso só funciona se o nome estiver no DNS. Caso contrário, você receberá a mensagem "nome do host: nome ou serviço desconhecido".
Vebjorn Ljosa

39
hostname -ié a forma abreviada equivalente
Paul Evans

75
Às vezes, isso simplesmente retorna 127.0.0.1. Se disponível, use melhor o hostname -I, conforme recomendado pelo manual (Ubuntu): "--ip-address Exiba os endereços de rede do nome do host. Observe que isso funciona apenas se o nome do host puder ser resolvido. Evite usar esta opção; use o nome do host - todos os endereços IP. "
Jrierab

11
Também não funciona no Linux, pelo menos não hostnameno GNU Coreutils versão 8.26.
Ack

5
Na minha máquina, hostname -idá apenas o IP local, enquanto hostname -Idá todos os outros IPs
Alexis Paques

62

no Linux

hostname -I

no macOS

ipconfig getifaddr en0

hostname -Ipode retornar vários endereços em uma ordem não confiável (consulte a página de hostnamemanual ), mas, para mim, apenas retorna 192.168.1.X, que é o que você queria.


11
para mim foi hostname -icom um eu mais baixo.
Paul Woitaschek 10/17/17

2
@PaulWoitaschek a página de manual para o minúsculas -ibandeira diz o seguinte: Avoid using this option; use hostname -I instead.
264 de Boris

@Boris se você estiver executando em algo como um recipiente janela de encaixe correndo Alpine (e, portanto, BusyBox) só irá aceitar minúsculas flag -i
bayetovsky

40

Solução

$ ip -o route get to 8.8.8.8 | sed -n 's/.*src \([0-9.]\+\).*/\1/p'
192.168.8.16

Explicação

A maneira correta de consultar informações de rede está usando ip:

  • -o saída de uma linha
  • route get to obter a rota real do kernel para um destino
  • 8.8.8.8 IP do Google, mas pode usar o IP real que você deseja alcançar

por exemplo, ipsaída:

8.8.8.8 via 192.168.8.254 dev enp0s25 src 192.168.8.16 uid 1000 \   cache

Para extrair o srcip, sedé o mais ligthest e mais compatível com o suporte a regex:

  • -n nenhuma saída por padrão
  • 's/pattern/replacement/p' corresponder apenas ao padrão e substituir a impressão
  • .*src \([0-9.]\+\).* corresponda ao IP src usado pelo kernel, para alcançar 8.8.8.8

por exemplo, saída final:

192.168.8.16

Outras respostas

Eu acho que nenhuma das respostas anteriores é boa o suficiente para mim, pois elas não funcionam em uma máquina recente (Gentoo 2018).

Problemas que encontrei nas respostas anteriores:

  • uso de coluna posicional na saída do comando;
  • uso de ifconfig que está obsoleto e - por exemplo - não lista IPs múltiplos;
  • uso de awkpara uma tarefa simples com a qual o sed pode lidar melhor;
  • ip route get 1 não é claro e é na verdade um alias para ip route get to 1.0.0.0
  • uso de hostnamecomando, que não tem -Iopção em todos os dispositivos e que retorna 127.0.0.1no meu caso.

34

Editado ( 01/06/2014 - 09-01-2018)

Para uma configuração mais forte, com muitas interfaces e muitos IP configurados em cada uma delas, escrevi um script bash puro (não baseado em 127.0.0.1) para encontrar a interface e o ip corretos , com base em default route. Eu posto este script na parte inferior desta resposta.

Introdução

Como ambos os instalado por padrão, há uma dica do bash para Mac e Linux:

O problema de localidade é evitado pelo uso de LANG=C:

myip=
while IFS=$': \t' read -a line ;do
    [ -z "${line%inet}" ] && ip=${line[${#line[1]}>4?1:2]} &&
        [ "${ip#127.0.0.1}" ] && myip=$ip
  done< <(LANG=C /sbin/ifconfig)
echo $myip

Colocando isso em uma função:

Mínimo:

getMyIP() {
    local _ip _line
    while IFS=$': \t' read -a _line ;do
        [ -z "${_line%inet}" ] &&
           _ip=${_line[${#_line[1]}>4?1:2]} &&
           [ "${_ip#127.0.0.1}" ] && echo $_ip && return 0
      done< <(LANG=C /sbin/ifconfig)
}

Uso simples:

getMyIP
192.168.1.37

Fantasia arrumada:

getMyIP() {
    local _ip _myip _line _nl=$'\n'
    while IFS=$': \t' read -a _line ;do
        [ -z "${_line%inet}" ] &&
           _ip=${_line[${#_line[1]}>4?1:2]} &&
           [ "${_ip#127.0.0.1}" ] && _myip=$_ip
      done< <(LANG=C /sbin/ifconfig)
    printf ${1+-v} $1 "%s${_nl:0:$[${#1}>0?0:1]}" $_myip
}

Uso:

getMyIP
192.168.1.37

ou, executando a mesma função, mas com um argumento:

getMyIP varHostIP
echo $varHostIP
192.168.1.37
set | grep ^varHostIP
varHostIP=192.168.1.37

Nota: Sem argumento, esta função gera STDOUT, o IP e uma nova linha , com um argumento, nada é impresso, mas uma variável chamada como argumento é criada e contém IP sem nova linha .

Nota2: Foi testado no Debian, LaCie hackeado nas e MaxOs. Se isso não funcionar no seu ambiente, ficarei muito interessado nos comentários!

Versão mais antiga desta resposta

(Não excluído porque com base em sed, não bash.)

Aviso: Há um problema sobre localidades!

Rápido e pequeno:

myIP=$(ip a s|sed -ne '/127.0.0.1/!{s/^[ \t]*inet[ \t]*\([0-9.]\+\)\/.*$/\1/p}')

Explodido (trabalho também;)

myIP=$(
    ip a s |
    sed -ne '
        /127.0.0.1/!{
            s/^[ \t]*inet[ \t]*\([0-9.]\+\)\/.*$/\1/p
        }
    '
)

Editar:

Quão! Isso parece não funcionar no Mac OS ...

Ok, isso parece funcionar da mesma forma no Mac OS e no meu Linux :

myIP=$(LANG=C /sbin/ifconfig  | sed -ne $'/127.0.0.1/ ! { s/^[ \t]*inet[ \t]\\{1,99\\}\\(addr:\\)\\{0,1\\}\\([0-9.]*\\)[ \t\/].*$/\\2/p; }')

dividido:

myIP=$(
    LANG=C /sbin/ifconfig  |
        sed -ne $'/127.0.0.1/ ! {
            s/^[ \t]*inet[ \t]\\{1,99\\}\\(addr:\\)\\{0,1\\}\\([0-9.]*\\)[ \t\/].*$/\\2/p;
        }')

Meu script (jan 2018):

Este script primeiro encontrará a rota e a interface padrão usadas, depois procurará a rede local correspondente do gateway e preencherá as variáveis. As duas últimas linhas são impressas, algo como:

Interface   : en0
Local Ip    : 10.2.5.3
Gateway     : 10.2.4.204
Net mask    : 255.255.252.0
Run on mac  : true

ou

Interface   : eth2
Local Ip    : 192.168.1.31
Gateway     : 192.168.1.1
Net mask    : 255.255.255.0
Run on mac  : false

Bem, aqui está:

#!/bin/bash
runOnMac=false
int2ip() { printf ${2+-v} $2 "%d.%d.%d.%d" \
        $(($1>>24)) $(($1>>16&255)) $(($1>>8&255)) $(($1&255)) ;}
ip2int() { local _a=(${1//./ }) ; printf ${2+-v} $2 "%u" $(( _a<<24 |
                  ${_a[1]} << 16 | ${_a[2]} << 8 | ${_a[3]} )) ;}
while IFS=$' :\t\r\n' read a b c d; do
    [ "$a" = "usage" ] && [ "$b" = "route" ] && runOnMac=true
    if $runOnMac ;then
        case $a in 
            gateway )    gWay=$b  ;;
            interface )  iFace=$b ;;
        esac
    else
        [ "$a" = "0.0.0.0" ] && [ "$c" = "$a" ] && iFace=${d##* } gWay=$b
    fi
done < <(/sbin/route -n 2>&1 || /sbin/route -n get 0.0.0.0/0)
ip2int $gWay gw
while read lhs rhs; do
    [ "$lhs" ] && { 
        [ -z "${lhs#*:}" ] && iface=${lhs%:}
        [ "$lhs" = "inet" ] && [ "$iface" = "$iFace" ] && {
            mask=${rhs#*netmask }
            mask=${mask%% *}
            [ "$mask" ] && [ -z "${mask%0x*}" ] &&
                printf -v mask %u $mask ||
                ip2int $mask mask
            ip2int ${rhs%% *} ip
            (( ( ip & mask ) == ( gw & mask ) )) &&
                int2ip $ip myIp && int2ip $mask netMask
        }
    }
done < <(/sbin/ifconfig)
printf "%-12s: %s\n" Interface $iFace Local\ Ip $myIp \
       Gateway $gWay Net\ mask $netMask Run\ on\ mac $runOnMac

11
@ absorin: sim, este trabalho agora com ifconfig. (como sbinnão é no meu $PATHfullpath tem de ser especificados, mas mesmo exist caminho no MacOS também :-).
F. Hauri

11
@sorin tentar isso com timea escolha que você usaria tanto tempo ...
F. Hauri

a solução rápida e pequena foi a melhor abordagem. As soluções mais recentes fornecem erros de sintaxe. A compatibilidade é sempre uma vantagem. Obrigado.
M3nda 17/03/2015

29

Específico para apenas certas versões do Ubuntu. Embora possa apenas lhe dizer 127.0.0.1:

hostname  -i

ou

hostname -I

isso funciona em todos os casos?
AloneInTheDark 21/03

6
não. - pode apenas dizer 127.0.0.1.
SvenDowideit

hostname -I trabalha no ubuntu.
Borzh

11
$ hostname --ip-addresssó me dá 127.0.0.1no Arch Linux
kristianlm

11
use hostname -I ou hostname --all-ip-address
Aydin K.

24

Você também pode obter o endereço IP versão 4 do eth0 usando este comando no linux

/sbin/ip -4 -o addr show dev eth0| awk '{split($4,a,"/");print a[1]}'

A saída será assim

[root@localhost Sathish]# /sbin/ip -4 -o addr show dev eth0| awk '{split($4,a,"/");print a[1]}'
192.168.1.22

A melhor resposta para mim! Obrigado @Sathish! ;-)
Samuel Phan

11
Concordo que este é o método mais limpo para obter o IPv4 da eth0.
Chris Mendez

Isso pressupõe eth0, que não é a estratégia de nomenclatura atual e nunca foi garantida a interface principal.
Rfay

Este é o método mais elegante se você conhece a interface. Ideal se o seu sistema tiver várias interfaces, mas você estiver interessado apenas em uma.
Lepe

14

Isso funciona no Linux e OSX

Isso obterá a interface associada à rota padrão

NET_IF=`netstat -rn | awk '/^0.0.0.0/ {thif=substr($0,74,10); print thif;} /^default.*UG/ {thif=substr($0,65,10); print thif;}'`

Usando a interface descoberta acima, obtenha o endereço IP.

NET_IP=`ifconfig ${NET_IF} | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'`

OSX

uname -a

Darwin laptop 14.4.0 Kernel do Darwin versão 14.4.0: qui 28 de maio às 11:35:04 PDT 2015; raiz: xnu-2782.30.5 ~ 1 / RELEASE_X86_64 x86_64

echo $NET_IF

en5

echo $NET_IP

192.168.0.130

CentOS Linux

uname -a

Linux dev-cil.medfx.local 2.6.18-164.el5xen 1 SMP qui 3 de setembro 04:03:03 EDT 2009 x86_64 x86_64 x86_64 GNU / Linux

echo $NET_IF

eth0

echo $NET_IP

192.168.46.10


Apesar de todas as respostas a essa pergunta, essa parece ser a única que chega perto de realmente estar correta. Só precisa de um | head -1no final da primeira linha para obter a interface padrão, e o resto é bom.
Endareth 24/03

12

Usando alguns dos outros métodos Você pode entrar em conflito em que vários endereços IP são definidos no sistema. Essa linha sempre obtém o endereço IP por padrão usado.

ip route get 8.8.8.8 | head -1 | awk '{print $7}'

Ele falhará se não houver uma rota padrão (mas é uma boa ideia) #
1260

Bom ... Suponha que funcione mesmo que você não tenha internet?
Boris Churzin

8

Estou extraindo meu comentário para esta resposta:

ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p'

Baseia-se na resposta @CollinAnderson, que não funcionou no meu caso.


8
ifconfig | grep 'inet ' | grep -v '127.0.0.1' | awk '{print $2}'

11
Se você estiver olhando para fazer isso em um bashapelido:alias myip="ifconfig | grep 'inet ' | grep -v '127.0.0.1' | awk '{print \$2}'"
Sam Houston

Direita. Mas a pergunta inicialmente era sobre o comando. Então, eu apenas postei de forma relevante. Felicidades!
Faizan Noor

6

A maneira mais curta de obter o seu endereço IPv4 local no seu sistema Linux:

hostname -I | awk '{print $1}'

5
Ruim. A página de manual diz especificamente para você não fazer nenhuma suposição sobre a ordem da saída.
Matt

Funciona muito bem para meus casos de uso triviais - não me importo se é rápido e sujo! Ótimo!
Nicolai Weitkemper 18/04/19

6

Supondo que você precise do seu IP público primário , visto do resto do mundo, tente um destes:

wget http://ipecho.net/plain -O - -q
curl http://icanhazip.com
curl http://ifconfig.me/ip

6

Eu tenho que acrescentar à resposta de Collin Andersons que esse método também leva em consideração se você tiver duas interfaces e as duas aparecerem como exibidas.

ip route get 1 | awk '{print $NF;exit}'

Eu tenho trabalhado em um aplicativo com Raspberry Pi e precisava do endereço IP que realmente estava sendo usado, não apenas se estava ativo ou não. A maioria das outras respostas retornará os dois endereços IP, o que não é necessariamente útil - para o meu cenário de qualquer maneira.


5

IP da interface de rede primária

ifconfig `ip route | grep default | head -1 | sed 's/\(.*dev \)\([a-z0-9]*\)\(.*\)/\2/g'` | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" | head -1

5

Localiza um endereço IP deste computador em uma rede que é um gateway padrão (por exemplo, exclui todas as redes virtuais, pontes de encaixe), por exemplo. gateway de internet, gateway wifi, ethernet

ip route| grep $(ip route |grep default | awk '{ print $5 }') | grep -v "default" | awk '/scope/ { print $9 }'

Funciona no Linux.

Teste:

  ~ ip route| grep $(ip route |grep default | awk '{ print $5 }') | grep -v "default" | awk '/scope/ { print $9 }'
192.168.0.114

  reverse-networking git:(feature/type-local)  ifconfig wlp2s0
wlp2s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.114  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::d3b9:8e6e:caee:444  prefixlen 64  scopeid 0x20<link>
        ether ac:x:y:z  txqueuelen 1000  (Ethernet)
        RX packets 25883684  bytes 27620415278 (25.7 GiB)
        RX errors 0  dropped 27  overruns 0  frame 0
        TX packets 7511319  bytes 1077539831 (1.0 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Agradável! A programação da Taco Bell é a melhor - obrigado por isso.
21419 Stevie Howard

3
ip addr show | grep -E '^\s*inet' | grep -m1 global | awk '{ print $2 }' | sed 's|/.*||'

3

Outra ifconfigvariação que funciona tanto no Linux quanto no OSX:

ifconfig | grep "inet " | cut -f2 -d' '

11
uma pequena variação:ifconfig | grep '\<inet\>' | cut -d ' ' -f2 | grep -v '127.0.0.1'
jpbochi

Por que metade dessas respostas não funciona para mim?
SurpriseDog

3

Passei por muitos links (StackExchange, AskUbuntu, StackOverflow, etc.) e tomei a decisão de combinar todas as melhores soluções em um único script de shell.

Na minha opinião, esses dois QAs são os melhores vistos:

Como posso obter meu endereço IP externo em um script de shell? https://unix.stackexchange.com/q/22615

Como encontro meu endereço IP interno? https://askubuntu.com/a/604691

Aqui está minha solução com base em algumas idéias de rsp compartilhadas em seu repositório ( https://github.com/rsp/scripts/ ).

Alguns de vocês podem dizer que esse script é extremamente grande para tarefas tão simples, mas eu gostaria de torná-lo o mais fácil e flexível possível. Ele suporta arquivo de configuração simples, permitindo redefinir os valores padrão.

Foi testado com sucesso sob Cygwin, MINGW e Linux (Red Hat).

Mostrar endereço IP interno

myip -i

Mostrar endereço IP externo

myip -e

Código-fonte, também disponível no link: https://github.com/ildar-shaimordanov/tea-set/blob/master/home/bin/myip . Existe um exemplo de arquivo de configuração, próximo ao script principal.

#!/bin/bash

# =========================================================================
#
# Getting both internal and external IP addresses used for outgoing 
# Internet connections.
#
# Internal IP address is the IP address of your computer network interface 
# that would be used to connect to Internet.
#
# External IP address is the IP address that is visible by external 
# servers that you connect to over Internet.
#
# Copyright (C) 2016 Ildar Shaimordanov
#
# =========================================================================

# Details of the actual implementation are based on the following QA:
#
# How can I get my external IP address in a shell script?
# https://unix.stackexchange.com/q/22615
#
# How do I find my internal ip address?
# https://askubuntu.com/a/604691

# =========================================================================

for f in \
    "$( dirname "$0" )/myip.conf" \
    ~/.myip.conf \
    /etc/myip.conf
do
    [ -f "$f" ] && {
        . "$f"
        break
    }
done

# =========================================================================

show_usage() {
    cat - <<HELP
USAGE
  $( basename "$0" ) [OPTIONS]

DESCRIPTION
  Display the internal and external IP addresses

OPTIONS
  -i  Display the internal IP address
  -e  Display the external IP address
  -v  Turn on verbosity
  -h  Print this help and exit
HELP
    exit
}

die() {
    echo "$( basename "$0" ): $@" >&2
    exit 2
}

# =========================================================================

show_internal=""
show_external=""
show_verbose=""

while getopts ":ievh" opt
do
    case "$opt" in
    i )
        show_internal=1
        ;;
    e )
        show_external=1
        ;;
    v )
        show_verbose=1
        ;;
    h )
        show_usage
        ;;
    \? )
        die "Illegal option: $OPTARG"
        ;;
    esac
done

if [ -z "$show_internal" -a -z "$show_external" ]
then
    show_internal=1
    show_external=1
fi

# =========================================================================

# Use Google's public DNS to resolve the internal IP address
[ -n "$TARGETADDR" ] || TARGETADDR="8.8.8.8"

# Query the specific URL to resolve the external IP address
[ -n "$IPURL" ] || IPURL="ipecho.net/plain"

# Define explicitly $IPCMD to gather $IPURL using another tool
[ -n "$IPCMD" ] || {
    if   which curl >/dev/null 2>&1
    then
        IPCMD="curl -s"
    elif which wget >/dev/null 2>&1
    then
        IPCMD="wget -qO -"
    else
        die "Neither curl nor wget installed"
    fi
}

# =========================================================================

resolveip() {
    {
        gethostip -d "$1" && return
        getent ahostsv4 "$1" \
        | grep RAW \
        | awk '{ print $1; exit }' 
    } 2>/dev/null
}

internalip() {
    [ -n "$show_verbose" ] && printf "Internal: "

    case "$( uname | tr '[:upper:]' '[:lower:]' )" in
    cygwin* | mingw* | msys* )
        netstat -rn \
        | grep -w '0.0.0.0' \
        | awk '{ print $4 }'
        return
        ;;
    esac

    local t="$( resolveip "$TARGETADDR" )"
    [ -n "$t" ] || die "Cannot resolve $TARGETADDR"
    ip route get "$t" \
    | awk '{ print $NF; exit }'
}

externalip() {
    [ -n "$show_verbose" ] && printf "External: "

    eval $IPCMD "$IPURL" $IPOPEN
}

# =========================================================================

[ -n "$show_internal" ] && internalip
[ -n "$show_external" ] && externalip

# =========================================================================

# EOF

3

Utilizo apenas nomes de interface de rede , meu comando personalizado é

[[ $(ip addr | grep enp0s25) != '' ]] && ip addr show dev enp0s25 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p' || ip addr show dev eth0 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p' 

no meu próprio caderno

[flying@lempstacker ~]$ cat /etc/redhat-release 
CentOS Linux release 7.2.1511 (Core) 
[flying@lempstacker ~]$ [[ $(ip addr | grep enp0s25) != '' ]] && ip addr show dev enp0s25 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p' || ip addr show dev eth0 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p'
192.168.2.221
[flying@lempstacker ~]$

mas se a interface de rede possuir pelo menos um ip, mostrará todos os ip pertencentes a ele

por exemplo

Ubuntu 16.10

root@yakkety:~# sed -r -n 's@"@@g;s@^VERSION=(.*)@\1@p' /etc/os-release
16.04.1 LTS (Xenial Xerus)
root@yakkety:~# [[ $(ip addr | grep enp0s25) != '' ]] && ip addr show dev enp0s25 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p' || ip addr show dev eth0 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p'
178.62.236.250
root@yakkety:~#

Debian Jessie

root@jessie:~# sed -r -n 's@"@@g;s@^PRETTY_NAME=(.*)@\1@p' /etc/os-release
Debian GNU/Linux 8 (jessie)
root@jessie:~# [[ $(ip addr | grep enp0s25) != '' ]] && ip addr show dev enp0s25 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p' || ip addr show dev eth0 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p'
192.81.222.54
root@jessie:~# 

CentOS 6.8

[root@centos68 ~]# cat /etc/redhat-release 
CentOS release 6.8 (Final)
[root@centos68 ~]# [[ $(ip addr | grep enp0s25) != '' ]] && ip addr show dev enp0s25 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p' || ip addr show dev eth0 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p'
162.243.17.224
10.13.0.5
[root@centos68 ~]# ip route get 1 | awk '{print $NF;exit}'
162.243.17.224
[root@centos68 ~]#

Fedora 24

[root@fedora24 ~]# cat /etc/redhat-release 
Fedora release 24 (Twenty Four)
[root@fedora24 ~]# [[ $(ip addr | grep enp0s25) != '' ]] && ip addr show dev enp0s25 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p' || ip addr show dev eth0 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p'
104.131.54.185
10.17.0.5
[root@fedora24 ~]# ip route get 1 | awk '{print $NF;exit}'
104.131.54.185
[root@fedora24 ~]#

Parece que o comando ip route get 1 | awk '{print $NF;exit}'fornecido pelo link é mais preciso, além do mais, é mais curto.


2

Não tenho certeza se isso funciona em todos os sistemas operacionais, experimente.

ifconfig | awk -F"[ :]+" '/inet addr/ && !/127.0/ {print $4}'

Não funciona no CentOS 7.0
Benoit Blanchon

@BenoitBlanchon Então use isso ip route get 1 | awk '{print $NF;exit}'. Deve funcionar na maioria dos sistemas.
JOTNE

De fato ip route get 1 | awk '{print $NF;exit}'funciona
Benoit Blanchon

2

Há um pacote de nós para tudo. É multiplataforma e fácil de usar.

$ npm install --global internal-ip-cli

$ internal-ip
fe80::1

$ internal-ip --ipv4
192.168.0.3

Essa é uma abordagem controversa, mas o uso do npm para ferramentas está se tornando mais popular, goste ou não.


1

Se você conhece a interface de rede (eth0, wlan, tun0 etc):

ifconfig eth0 | grep addr: | awk '{ print $2 }' | cut -d: -f2

1
ifconfig | grep "inet addr:" | grep -v "127.0.0.1" | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'  | head -1

não está funcionando no macOS 10.12.6
Antoine F.

1
ifconfig $(netstat -rn | grep -E "^default|^0.0.0.0" | head -1 | awk '{print $NF}') | grep 'inet ' | awk '{print $2}' | grep -Eo '([0-9]*\.){3}[0-9]*' 

1

Funciona em Mac, Linux e dentro de Docker Containers:

$ hostname --ip-address 2> /dev/null || (ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p' | awk '{print$ 1; Saída}')

Também funciona Makefilecomo:

LOCAL_HOST := ${shell hostname --ip-address 2> /dev/null || (ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p' | awk '{print $1; exit}')}


Mac não funcionam: hostname --ip-address=> hostname: illegal option -- -no MacOS Sierra
JL Peyret

1

Para o Linux, o que você precisa é este comando:

ifconfig $1|sed -n 2p|awk '{ print $2 }'|awk -F : '{ print $2 }'

digite isso no seu shell e você simplesmente conhecerá o seu ip.


Não, não funciona.
FractalSpace

1

É mais fácil de ler: ifconfig | grep 'inet addr:' |/usr/bin/awk '{print $2}' | tr -d addr:


não está funcionando no macOS 10.12.6
Antoine F.

1

Se você possui npme nodeinstalou:npm install -g ip && node -e "const ip = require('ip'); console.log(ip.address())"

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.