it-swarm-pt.tech

Qual comando do terminal para obter apenas o endereço IP e nada mais?

Eu estou tentando usar apenas o endereço IP (inet) como um parâmetro em um script que escrevi.

Existe um caminho fácil em um terminal unix para obter apenas o endereço IP, em vez de procurar por ifconfig

77
Mason

Você pode escrever um script que só retorna o IP como:

/sbin/ifconfig eth0 | grep 'inet addr' | cut -d: -f2 | awk '{print $1}'

Para o MAC:

ifconfig | grep "inet " | grep -v 127.0.0.1 | cut -d\  -f2

Ou para o sistema linux

hostname -i | awk '{print $3}' # Ubuntu 

hostname -i # Debian
121
Book Of Zeus

Isto lhe dará todas as interfaces IPv4, incluindo o loopback 127.0.0.1:

ip -4 addr | grep -oP '(?<=inet\s)\d+(\.\d+){3}'

Isso só mostrará eth0:

ip -4 addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'

E assim você pode obter endereços IPv6:

ip -6 addr | grep -oP '(?<=inet6\s)[\da-f:]+'

Apenas eth0 IPv6:

ip -6 addr show eth0 | grep -oP '(?<=inet6\s)[\da-f:]+'
31
SAM

Geralmente, nunca é garantido que um sistema tenha apenas um endereço IP, por exemplo, você pode ter conexões ethernet e wlan e, se tiver uma conexão VPN ativa, terá ainda outro endereço IP.

Linux

No Linux, hostname -I listará o (s) endereço (s) IP atual (es). Confiar nele sempre retornando apenas um endereço IP provavelmente não funcionará como esperado em alguns cenários (ou seja, um link VPN está ativo), portanto, um modo mais confiável seria converter o resultado em um array e, em seguida, repetir os elementos:

ips=($(hostname -I))

for ip in "${ips[@]}"
do
    echo $ip
done

OSX

No OSX, se você conhece a interface , você pode usar:

~$ ipconfig getifaddr en0
192.168.1.123

que retornará apenas o endereço IP.

Ou você pode passar por cima de possíveis nomes de interface, começando com um sufixo, ou seja, en:

for NUMBER in $(seq 0 5); do
    ip=`ipconfig getifaddr en$NUMBER`
    if [ -n "$ip" ]; then
        myip="$ip"
        break
    fi
done

echo $myip

Além disso, obter o endereço IP torna-se não determinístico no caso de conexões a cabo e Wi-Fi serem estabelecidas, quando uma máquina tiver mais de uma interface Ethernet ou quando houver túneis VPN presentes.

Obtendo o IP externo

Se você precisar do IP externo, poderá consultar um serviço de modo de texto, por exemplo, curl ipecho.net/plain retornará um texto simples external IP.

30
ccpizza

No mais recente Ubuntu versions ( 14.04 - 16.04 ), este comando fez o truque para mim.

hostname -I | awk '{print $1}'
9
Da CodeKid
hostname -I  

Este comando lhe dará o endereço IP exato que você deseja no Ubuntu.

7
Vignajeth

Se você tem um ambiente limitado, você pode usar este comando:

ip -4 addr show dev eth0 | grep inet | tr -s " " | cut -d" " -f3 | head -n 1
6
caglar

O comando ifconfig é depreciado e você deve usar o comando ip no Linux.

Além disso, ip a fornecerá o escopo na mesma linha do IP, para facilitar o uso.

Este comando mostrará seu IP global (externo):

ip a | grep "scope global" | grep -Po '(?<=inet )[\d.]+'

Todos os IPv4 (também 127.0.0.1):

ip a | grep "scope" | grep -Po '(?<=inet )[\d.]+'

Todos os IPv6 (também :: 1):

ip a | grep "scope" | grep -Po '(?<=inet6 )[\da-z:]+'
5
Nux

Eu queria algo simples que funcionasse como um alias de Bash. Eu descobri que hostname -I funciona melhor para mim (hostname v3.15). hostname -i retorna o IP de loopback, por algum motivo, mas hostname -I me fornece o IP correto para wlan0 e sem ter que canalizar a saída através de grep ou awk. Uma desvantagem é que hostname -I produzirá all IPs, se você tiver mais de um.

3
Andy Forceno

Podemos simplesmente usar apenas 2 comandos (ifconfig + awk) para obter apenas o IP (v4) que queremos da seguinte forma:

No Linux, assumindo para obter o endereço IP da interface eth0, execute o seguinte comando:

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

No OSX, assumindo o endereço IP da interface en0, execute o seguinte comando:

/sbin/ifconfig en0 | awk '/inet /{print $2}'
3
zdk

Para obter apenas o endereço IP em Mac OS X , você pode digitar o seguinte comando:

ipconfig getifaddr en0
3
Tukan3

Em man hostname existe uma maneira ainda mais fácil que exclui automaticamente o IP de loopback e mostra apenas uma lista separada por espaço de todos os endereços IP do host:

[email protected]:~# hostname --all-ip-addresses
11.12.13.14 192.168.15.19 

[email protected]:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
   link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
   inet 127.0.0.1/8 scope Host lo
   inet6 ::1/128 scope Host 
   valid_lft forever preferred_lft forever
2: venet0: <BROADCAST,POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN 
  link/void 
  inet 11.12.13.14/32 scope global venet0:0
  inet 192.168.15.19/32 scope global venet0:1
2
user10101010

Isso faria o truque em um Mac:

ping $(ifconfig en0 | awk '$1 == "inet" {print $2}')

Isso resolveu ping 192.168.1.2 na minha máquina.

Pro tip : $(...) significa executar o que estiver dentro dos parênteses em um subshell e retorná-lo como o valor. 

2
Abdellah Alaoui

Aqui está a minha versão, em que você pode passar uma lista de interfaces, ordenadas por prioridade:

getIpFromInterface()
{
    interface=$1
    ifconfig ${interface}  > /dev/null 2>&1 && ifconfig ${interface} | awk -F'inet ' '{ print $2 }' | awk '{ print $1 }' | grep .
}

getCurrentIpAddress(){
    IFLIST=(${@:-${IFLIST[@]}})
    for currentInterface in ${IFLIST[@]}
    do
        IP=$(getIpFromInterface  $currentInterface)
        [[ -z "$IP" ]] && continue
    echo ${IP/*:}
    return
    done
}

IFLIST=(tap0 en1 en0)
getCurrentIpAddress [email protected]

Então, se eu estiver conectado com VPN, Wifi e ethernet, meu endereço de VPN (na interface tap0) será retornado. O script funciona tanto no linux quanto no osx, e pode receber argumentos se você quiser sobrescrever o IFLIST 

Note que se você quiser usar IPV6, você terá que substituir 'inet' por 'inet6'.

1
MatthieuP

Use o seguinte comando:

/sbin/ifconfig $(netstat -nr | tail -1 | awk '{print $NF}') | awk -F: '/inet /{print $2}' | cut -f1 -d ' '
1
Jose Martinez

use este script de uma linha: ifconfig | grep "inet " | grep -v 127.0.0.1|awk 'match($0, /([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/) {print substr($0,RSTART,RLENGTH)}' mac & linux (testado no ubuntu) ambos funcionam.

1
Huan

Você também pode usar o seguinte comando: 

ip route | grep src

NOTA: Isso só funcionará se você tiver conectividade com a Internet. 

1
Search Info

Eu sempre acabo precisando disso nos momentos mais inesperados e, sem falta, acabo procurando tópicos como esse no SO. Então eu escrevi um script simples para obter endereços IPv4 via netstat, chamado echoip - você pode encontrá-lo aqui . O bash dos endereços de rede é assim, ele também obtém seu endereço público do ipecho.net:

IPV4='\d+(\.\d+){3}'
INTERFACES=`netstat -i | grep -E "$IPV4" | cut -d ' ' -f 1`
INTERFACE_IPS=`netstat -i | grep -oE "$IPV4"`

for i in "${!INTERFACES[@]}"; do
  printf "%s:\t%s\n" "${INTERFACES[$i]}" "${INTERFACE_IPS[$i]}"
done

O script echoip produz uma saída como esta:

$ echoip
public: 26.106.59.169
en0:    10.1.10.2
1
stites
ip addr|awk '/eth0/ && /inet/ {gsub(/\/[0-9][0-9]/,""); print $2}'

mostra todos os seus ips

0
MaXiM

No Redhat 64bit, isso resolveu o problema para mim.

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