Какая команда терминала должна получить только IP-адрес и ничего больше?


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

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

21 64

21 ответ:

вы можете написать скрипт, который возвращает только IP, например:

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

для MAC:

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

или для системы linux

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

hostname -i # Debian

как правило, никогда не гарантируется, что система будет иметь только один IP-адрес, например, вы можете иметь как ethernet, так и wlan-соединения, и если у вас есть активное VPN-соединение, то у вас будет еще один IP-адрес.

Linux

В Linux hostname -I будет отображаться текущий IP-адрес (ы). Полагаясь на то, что он всегда возвращает только один IP-адрес, скорее всего, не будет работать так, как ожидалось в некоторых сценариях (т. е. VPN-ссылка включена), поэтому более надежный способ будет преобразуйте результат в массив, а затем выполните цикл по элементам:

ips=($(hostname -I))

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

OSX

на OSX, если вы знаете интерфейса, вы могли бы использовать:

~$ ipconfig getifaddr en0
192.168.1.123

что вернет просто IP-адрес.

или вы можете перебирать возможные имена интерфейсов, начиная с суффикса, т. е. en:

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

echo $myip

кроме того, получение IP-адреса становится недетерминированным в случае подключения кабеля и wifi устанавливаются, когда машина имеет несколько интерфейсов ethernet, или когда присутствуют VPN-туннели.

получение внешнего IP

Если вам нужен внешний IP, то вы можете запросить в текстовом режиме, например curl ipecho.net/plain возвращает обычный текст внешний IP.

это даст вам все интерфейсы IPv4, включая loopback 127.0.0.1:

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

это покажет только eth0:

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

и таким образом, вы можете получить IPv6-адреса:

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

только eth0 IPv6:

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

на последний Ubuntu версиях (14.04-16.04), эта команда сделала трюк для меня.

hostname -I | awk '{print }'

Если у вас ограниченная среда, Вы можете использовать эту команду:

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

команда ifconfig является устаревшим, и вы должны использовать ip команда на Linux.

и ip a даст вам область на той же линии, что и IP, поэтому ее проще использовать.

эта команда покажет вам ваш глобальный (внешний) IP-адрес:

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

все IPv4 (также 127.0.0.1):

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

все IPv6 (также ::1):

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

эта команда даст вам точный IP-адрес, как вы хотите в Ubuntu.

чтобы получить только IP-адрес на Mac OS X вы можете ввести следующую команду:

ipconfig getifaddr en0

мы можем просто использовать только 2 команды (ifconfig + awk), чтобы получить только IP (v4) мы хотим так:

на Linux, предполагая получить IP-адрес от eth0 интерфейс, выполните следующую команду:

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

на OSX, предполагая получить IP-адрес от en0 интерфейс, выполните следующую команду:

/sbin/ifconfig en0 | awk '/inet /{print }'

Я хотел что-то простое, что работало как псевдоним Bash. Я нашел это hostname -I лучше всего работает для меня (имя хоста v3. 15). hostname -i возвращает loopback IP, по какой-то причине, но hostname -I дает мне правильный IP для wlan0,и без необходимости передавать вывод через grep или awk. Недостатком является то, что hostname -I выводит все IPs, если у вас есть более одного.

что бы сделать трюк в Mac:

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

что решил ping 192.168.1.2 в моей машине.

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

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

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

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

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

Я всегда нуждаюсь в этом в самые неожиданные моменты и, в обязательном порядке, заканчиваю поиск таких нитей на 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

The echoip скрипт выдает такой результат:

$ echoip
public: 26.106.59.169
en0:    10.1.10.2

используйте этот сценарий одной строки: ifconfig | grep "inet " | grep -v 127.0.0.1|awk 'match(, /([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/) {print substr(,RSTART,RLENGTH)}' mac & linux (проверено в ubuntu) оба работает.

на man hostname есть еще более простой способ, который автоматически исключает loopback 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
ip addr|awk '/eth0/ && /inet/ {gsub(/\/[0-9][0-9]/,""); print }'

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

на Redhat 64bit, это решило проблему для меня.

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

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

ip route | grep src

Примечание: это будет работать только если у вас есть подключение к интернету.

curl ifconfig.co 

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

Я бы использовал Hostname -L чтобы получить только IP для использования в качестве переменной в скрипте.