Respostas:
salve isso em um arquivo e execute bash <filename>
#!/bin/bash
ifconfig eth0 | grep "inet addr"
sendo mais preciso obter apenas o número que mostra o endereço IP:
#!/bin/bash
ifconfig eth0 | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1
Atualização : se isso não funcionar, tente a outra resposta
grep "inet"
Para fornecer outra opção, você pode usar o ip addr
comando dessa maneira para obter o endereço IP:
ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1
ip addr show eth0
mostra informações sobre eth0
grep "inet\b"
mostra apenas a linha que possui o endereço IPv4 (se você quiser o endereço IPv6, altere-o para "inet6\b"
)awk '{print $2}'
imprime no segundo campo, que possui o endereço ip / máscara, exemplo 172.20.20.15/25
cut -d/ -f1
leva apenas a parte do endereço IP.Em um script:
#!/bin/bash
theIPaddress=$(ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)
Retirado de /programming//a/14910952/1695680
hostname -i
No entanto, isso pode retornar um endereço IP local (127.0.0.1), portanto, você pode precisar usar e filtrar:
hostname -I
Nas páginas de manual do nome do host:
-i, --ip-address
Exibir 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.
-I, --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.
ip addr show label 'enp*'
melhor, mas eu é parse irritante, algo como ip addr show label 'enp*' | grep -oP inet\ \\S+ | cut -d' ' -f2
o trabalho pode ... o quão bonita
A resposta de @ markus-lindberg é a minha favorita. Se você adicionar -o -4
aos sinalizadores do ip, obterá uma saída muito mais facilmente analisável (e consistente):
ip -o -4 a | awk '$2 == "eth0" { gsub(/\/.*/, "", $4); print $4 }'
-o
significa --oneline
, que se destina a ajudar exatamente nesse tipo de situação. O -4
é adicionado ao limite para o endereço IPv4, que é o que todas as outras respostas implicam.
ip
bandeiras. Usando um cut
pouco de awk
bruxaria avançada :ip -o -4 addr show eth0 scope global | awk '{print $4;}' | cut -d/ -f 1
cut
muito depois de aprender awk
e gosto de minimizar o número de comandos em meus pipelines. Sugestão agradável em qualquer caso.
Aqui estão alguns oneliners .....
Awk
ifconfig eth0 | awk '/inet addr/{split($2,a,":"); print a[2]}'
A função split no comando awk acima divide a segunda coluna com base no delimitador :
e armazena o valor dividido em uma matriz associativa a
. Então, a[2]
mantém o valor da segunda parte.
sed
ifconfig eth0 | sed -n '/inet addr/s/.*inet addr: *\([^[:space:]]\+\).*/\1/p'
No sed básico, \(...\)
chamado grupo de captura que é usado para capturar os caracteres. Poderíamos referenciar os caracteres capturados por meio de referência posterior.\([^[:space:]]\+\)
captura qualquer personagem, mas não espaço, uma ou mais vezes.
grep
ifconfig eth0 | grep -oP 'inet addr:\K\S+'
\K
descarta os caracteres correspondidos anteriormente da impressão na final e \S+
corresponde a um ou mais caracteres não espaciais.
Perl
ifconfig eth0 | perl -lane 'print $1 if /inet addr:(\S+)/'
Um ou mais caracteres não espaciais próximos à inet addr:
sequência são capturados e, finalmente, imprimimos apenas esses caracteres capturados.
Você deve usar ip
(em vez de ifconfig
) como é atual, mantida e talvez o mais importante para fins de script, produz uma saída consistente e analisável. A seguir, algumas abordagens semelhantes:
Se você deseja o endereço IPv4 para sua interface Ethernet eth0
:
$ ip -4 -o addr show eth0 | awk '{print $4}'
192.168.1.166/24
Como um script:
$ INTFC=eth0
$ MYIPV4=$(ip -4 -o addr show $INTFC | awk '{print $4}')
$ echo $MYIPV4
192.168.1.166/24
A saída produzida acima está na notação CIDR. Se a notação CIDR não for desejada, ela poderá ser removida:
$ ip -4 -o addr show eth0 | awk '{print $4}' | cut -d "/" -f 1
192.168.1.166
Outra opção que o IMHO é "mais elegante" obtém o endereço IPv4 para qualquer interface usada para conectar-se ao host remoto especificado (8.8.8.8 neste caso). Cortesia de @gatoatigrado nesta resposta :
$ ip route get 8.8.8.8 | awk '{ print $NF; exit }'
192.168.1.166
Como um script:
$ RHOST=8.8.8.8
$ MYIP=$(ip route get $RHOST | awk '{ print $NF; exit }')
$ echo $MYIP
192.168.1.166
Isso funciona perfeitamente bem em um host com uma única interface, mas mais vantajosamente também funcionará em hosts com várias interfaces e / ou especificações de rota.
Embora ip
seja minha abordagem preferida, certamente não é a única maneira de esfolar esse gato. Aqui está outra abordagem usada hostname
se você preferir algo mais fácil / mais conciso:
$ hostname --all-ip-addresses | awk '{print $1}'
Ou, se você deseja o endereço IPv6:
$ hostname --all-ip-addresses | awk '{print $2}'
Como um script:
$ MYV4IP=$(hostname --all-ip-addresses | awk '{print $1}')
$ MYV6IP=$(hostname --all-ip-addresses | awk '{print $2}')
$ echo $MYV4IP
192.168.1.166
$ echo $MYV6IP
2601:7c1:103:b27:352e:e151:c7d8:3379
Sugiro o uso de uma biblioteca python, como netifaces, projetada especificamente para esse fim.
sudo pip install netifaces
python -c "import netifaces; print netifaces.ifaddresses('eth0')[netifaces.AF_INET][0]['addr']"
Para obter a interface de rede padrão que está em uso.
default_inf = netifaces.gateways()['default'][netifaces.AF_INET][1]
ip addr|awk '/eth0/ && /inet/ {gsub(/\/[0-9][0-9]/,""); print $2}'
Este uso apenas ip addr
é um substituto ifconfig
e awk
combinado com a substituição (gsub).
Apenas mais uma opção que pode ser útil se você não tiver o awk (como é o caso em alguns dispositivos incorporados):
ip addr show dev eth0 scope global | grep "inet\b" | cut -d/ -f 1 | egrep -o "([[:digit:]]{1,3}[.]{1}){3}[[:digit:]]{1,3}"
ifconfig eth0|grep 'inet '|awk '{print $2}'
isso também pode ser usado com um usuário normal.
ip addr show eth0 | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
ip addr show | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
cut
duas vezes em vez de uma combinação de awk
e cut
para analisar a saída. Da próxima vez, verifique melhor todas as outras respostas primeiro e garanta que não publique uma solução duplicada. Nesse caso, acho que é discutível se é uma duplicata ou se é semelhante; portanto, tome isso como uma dica geral. Obrigado.
Esta é a maneira mais curta que pude encontrar:
ip -f inet addr show $1 | grep -Po 'inet \K[\d.]+'
Substituir $1
pela sua interface de rede.
ip -f inet
diz ao ip para retornar apenas valores para a família inet (ipv4).
grep -Po
diz ao grep para interoperar o próximo valor como um perl-regex e imprima apenas os valores correspondentes.
O regex \K[\d.]+
diz "jogue fora tudo até esse ponto (\ K) e combine o máximo de valores numéricos seguidos por um ponto em uma linha possível". Portanto, isso corresponderá apenas ao endereço IP e ignorará tudo depois dele, incluindo a máscara de sub-rede de atalho \ XX.
hoje em dia com múltiplas interfaces (por exemplo, se você usa uma janela de encaixe) e a interface de nomenclatura da ETH não é mais as normas
Eu uso este comando para extrair o IP / Mask:
IPMASK=$(ip a s|grep -A8 -m1 MULTICAST|grep -m1 inet|cut -d' ' -f6)
Portanto, quaisquer que sejam as interfaces que eu tenha e o nome delas, o GREP será o primeiro a ter a opção MULTICAST.
Eu uso este comando para extrair apenas o IP sem a máscara:
IP=$(ip a s|grep -A8 -m1 MULTICAST|grep -m1 inet|cut -d' ' -f6|cut -d'/' -f1)
Eu uso esses comandos em diferentes BDS & NIX e nunca falha;)
ip
, use a -o
opção
No meu script, estou usando algo assim:
re="inet[[:space:]]+([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)"
if [[ $(ip addr show eth0) =~ $re ]]; then
echo ${BASH_REMATCH[1]}
else
echo "Cannot determin IP" 1>&2
fi
Não gera nenhum processo.