Какой терминальной командой получить только IP-адрес и больше ничего? - PullRequest
91 голосов
/ 16 декабря 2011

Я пытаюсь использовать только IP-адрес (inet) в качестве параметра в сценарии, который я написал.

Есть ли в unix-терминале простой способ получить только IP-адрес вместо просмотра ifconfig?

Ответы [ 24 ]

2 голосов
/ 10 августа 2018

В man hostname есть еще более простой способ, который автоматически исключает петлевой IP и отображает только список разделенных пробелами всех назначенных IP-адресов хоста:

root@srv:~# hostname --all-ip-addresses
11.12.13.14 192.168.15.19 

root@srv:~# 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 голосов
/ 04 сентября 2018

Вы также можете использовать следующую команду:

ip route | grep src

ПРИМЕЧАНИЕ: Это будет работать только при наличии подключения к Интернету.

2 голосов
/ 14 ноября 2017

Это бы сработало в Mac:

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

Это разрешено до ping 192.168.1.2 в моей машине.

Pro tip : $(...) означает запустить все, что находится внутри скобок в подоболочке, и вернуть это значение

1 голос
/ 29 ноября 2014

Я всегда нуждаюсь в этом в самые неожиданные времена и, в обязательном порядке, ищу такие темы в SO. Поэтому я написал простой скрипт для получения адресов IPv4 через netstat, который называется echoip - . Вы можете найти его здесь . Bash для сетевых адресов выглядит следующим образом, он также получает ваш публичный адрес от 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

Сценарий echoip выдает следующий вывод:

$ echoip
public: 26.106.59.169
en0:    10.1.10.2
1 голос
/ 21 января 2014

Используйте следующую команду:

/sbin/ifconfig $(netstat -nr | tail -1 | awk '{print $NF}') | awk -F: '/inet /{print $2}' | cut -f1 -d ' '
1 голос
/ 17 июля 2017

используйте этот однострочный скрипт: 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 (протестировано в Ubuntu) оба работает.

1 голос
/ 09 июня 2014

Вот моя версия, в которой вы можете передать список интерфейсов, упорядоченный по приоритету:

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 $@

Так что, если я подключен через VPN, Wifi и Ethernet, мой VPN-адрес (на интерфейсе tap0) будет возвращен. Скрипт работает как на linux, так и на osx и может принимать аргументы, если вы хотите переопределить IFLIST

Обратите внимание, что если вы хотите использовать IPV6, вам придется заменить «inet» на «inet6».

0 голосов
/ 09 июня 2019
#!/bin/sh
# Tested on Ubuntu 18.04 and Alpine Linux 
# List IPS of following network interfaces:
# virtual host interfaces
# PCI interfaces
# USB interfaces
# ACPI interfaces
# ETH interfaces
for NETWORK_INTERFACE in $(ls /sys/class/net -al | grep -iE "(/eth[0-9]+$|vif|pci|acpi|usb)" | sed -E "s@.* ([^ ]*) ->.*@\1@"); do 
    IPV4_ADDRESSES=$(ifconfig $NETWORK_INTERFACE | grep -iE '(inet addr[: ]+|inet[: ]+)' | sed -E "s@\s*(inet addr[: ]+|inet[: ]+)([^ ]*) .*@\2@")
    IPV6_ADDRESSES=$(ifconfig $NETWORK_INTERFACE | grep -iE '(inet6 addr[: ]+|inet6[: ]+)' | sed -E "s@\s*(inet6 addr[: ]+|inet6[: ]+)([^ ]*) .*@\2@")
    if [ -n "$IPV4_ADDRESSES" ] || [ -n "$IPV6_ADDRESSES" ]; then
        echo "NETWORK INTERFACE=$NETWORK_INTERFACE"
        for IPV4_ADDRESS in $IPV4_ADDRESSES; do 
            echo "IPV4=$IPV4_ADDRESS"
        done
        for IPV6_ADDRESS in $IPV6_ADDRESSES; do 
            echo "IPV6=$IPV6_ADDRESS"
        done
    fi
done
0 голосов
/ 19 января 2016
ip addr|awk '/eth0/ && /inet/ {gsub(/\/[0-9][0-9]/,""); print $2}'

показывает все ваши ips

0 голосов
/ 08 мая 2018
curl ifconfig.co 

Возвращает только IP-адрес вашей системы.

...