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

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

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

Ответы [ 24 ]

140 голосов
/ 16 декабря 2011

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

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

Для MAC:

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

Или для системы Linux

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

hostname -i # Debian
38 голосов
/ 02 ноября 2014

Это даст вам все интерфейсы IPv4, включая петлю 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:]+'
32 голосов
/ 08 июля 2014

Как правило, никогда не гарантируется, что система будет иметь только один 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-адреса становится недетерминированнымв случае, если установлены как кабельные, так и Wi-Fi-соединения, когда у машины более одного Ethernet-интерфейса или когда присутствуют VPN-туннели.

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

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

9 голосов
/ 06 июля 2017
hostname -I  

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

9 голосов
/ 12 мая 2016

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

hostname -I | awk '{print $1}'
7 голосов
/ 09 октября 2017

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

ip -4 addr show dev eth0 | grep inet | tr -s " " | cut -d" " -f3 | head -n 1
4 голосов
/ 05 августа 2014

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

ipconfig getifaddr en0
4 голосов
/ 05 февраля 2018

Команда 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:]+'
4 голосов
/ 03 ноября 2015

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

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

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

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

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

Чтобы узнать наш публичный / внешний IP, добавьте этофункция в ~/.bashrc

whatismyip () {
    curl -s "http://api.duckduckgo.com/?q=ip&format=json" | jq '.Answer' | grep --color=auto -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"
}

Затем запустите, whatismyip

3 голосов
/ 23 марта 2015

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

...