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

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

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


person Mason    schedule 16.12.2011    source источник
comment
Да, или любой другой уникальный идентификатор машины, я полагаю.   -  person Mason    schedule 16.12.2011
comment
вы получаете недопустимую опцию для имени хоста -i?   -  person Ken    schedule 16.12.2011
comment
Да, на Mac OS X Lion. Но оказалось, что я буду делать это на Ubuntu, где это работает. Спасибо!   -  person Mason    schedule 16.12.2011
comment
имя хоста не так надежно, как ifconfig   -  person joel    schedule 16.12.2011
comment
Джоэл прав, особенно вы говорите о MAC OS, а затем об Ubuntu   -  person zackaryka    schedule 17.12.2011
comment
Просматривая ответы ниже, имейте в виду, что с выводом ip -o address гораздо проще работать, чем с выводом ip address.   -  person jlh    schedule 24.05.2018


Ответы (31)


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

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

Для МАК:

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

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

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

hostname -i # Debian
person Book Of Zeus    schedule 16.12.2011
comment
hostname -i на моем он возвращает: ::1 127.0.1.1 192.168.1.100 - person Book Of Zeus; 16.12.2011
comment
В Debian у меня есть только один ip. Так что использование hostname не переносимо. - person Timofey Stolbov; 16.12.2011
comment
Он говорит, что -i и -I являются недопустимыми опциями - person Mason; 16.12.2011
comment
Команда hostname не работает на Mountain Lion для этой задачи. Страница man говорит, что принимает только флаги [-fs], которые, честно говоря, здесь бесполезны... - person Matt; 16.08.2013
comment
Подводя итог: первый способ зависит от адаптера, который не всегда одинаков. Второй для меня показывает два IP-адреса, а последние два не работают на Mac. - person Matt; 16.08.2013
comment
как вы сохраняете этот вывод в переменной? - person Pototo; 18.06.2014
comment
@Pototo cyberciti.biz/faq / - person Book Of Zeus; 24.07.2014
comment
cut -d/ у меня работает (косая черта). не обратная косая черта - person mr5; 18.05.2017
comment
ifconfig здесь устарел и ненадежен, например. grep терпит неудачу в debian 9 (stretch), потому что он больше не выводит inet addr: 172.17.0.4, он выводит только inet 172.17.0.4. Вместо этого используйте ip, как описано в stackoverflow.com/a/26694162/72717. - person jamshid; 16.06.2019
comment
Я должен использовать adr вместо addr. - person Rohlik; 07.07.2020
comment
@BookOfZeus Я имею в виду /sbin/ifconfig eth0 | grep 'inet adr' | cut -d: -f2 | awk '{print $1}' вместо /sbin/ifconfig eth0 | grep 'inet addr' | cut -d: -f2 | awk '{print $1}'. - person Rohlik; 10.07.2020
comment
/sbin/ifconfig eth0 | grep 'инет' | вырезать -d: -f2 | awk '{напечатать $2}' - person Jack Liu Shurui; 27.07.2020
comment
Если вы прочтете man hostname, вы увидите, что в настоящее время вы должны говорить hostname --all-ip-addresses в Linux. Это напечатает все IP-адреса, которые вы разделили пробелами. Если вы не используете несколько сетевых адаптеров или виртуальную сеть, вы получите только один IP-адрес. - person Mikko Rantalainen; 17.12.2020
comment
@MikkoRantalainen $ hostname --all-ip-addresses | sed '1s/[^ \t]//g' |wc -c результат: 10 - person Book Of Zeus; 17.01.2021
comment
@BookOfZeus Зачем вам подсчитывать количество символов в выводе hostname --all-ip-addresses? - person Mikko Rantalainen; 20.01.2021
comment
@MikkoRantalainen, лол, который подсчитывает количество IP-адресов ... я хочу сказать, что если у вас несколько интерфейсов, hostname --all-ip-addresses недостаточно. Итак, вывод этой команды: 10.0.0.18 172.22.0.1 172.19.0.1 172.20.0.1 172.18.0.1 172.21.0.1 172.17.0.1 172.23.0.1 192.168.42.1 etc.... - person Book Of Zeus; 27.01.2021
comment
@BookOfZeus: хорошо, у меня есть один IP-адрес, и ваш скрипт выдал 2, так что он считает по крайней мере один за другим. Выполнение чего-то вроде hostname --all-ip-addresses | xargs -rn1 echo | wc -l или hostname --all-ip-addresses | grep -o ' ' | wc -l должно выдать правильное число. - person Mikko Rantalainen; 27.01.2021
comment
Из записи для параметра -I/--all-ip-addresses на справочной странице hostname(1): Do not make any assumptions about the order of the output. - person kevmitch; 12.06.2021

Это даст вам все интерфейсы 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:]+'
person SAM    schedule 01.11.2014
comment
Ошибка grep -oP на busybox v1.24.1: недопустимая опция -- P - person Pro Backup; 18.08.2016
comment
grep не установлен практически на каждом контейнере докеров для prod. Так что, хотя все это хорошие команды, они не будут полезны для контейнеров :-( - person AndyGee; 27.02.2019
comment
Лучший ответ для моего конкретного случая. Вам нужен переключатель -P для регулярных выражений Perl, иначе мы не сможем использовать токен lookbehind (?<=inet\s). Вы можете получить аналогичный результат, запустив grep -oe 'inet [0-9\.]\+' или grep -oe 'inet6 [0-9a-f:]\+', но таким образом я не могу избавиться от первого слова. В SuSE man grep сообщает, что флаг -P является экспериментальным. - person Jorge Bellon; 08.03.2019
comment
Это лучший ответ. ifconfig устарел уже несколько лет на большинстве ОС. - person pozcircuitboy; 19.06.2019
comment
Укороченная версия второй команды: ip -4 a show eth0 | grep -Po 'inet \K[0-9.]*' - person tukusejssirs; 19.01.2020

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

линукс

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

ips=($(hostname -I))

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

Примечание. Если hostname -I возвращает IP-адрес как в формате IPv4, так и в формате IPv6, вы можете использовать вместо него hostname -I | cut -f1 -d' ', чтобы показать только IP-адрес IPv4.

ОС X

В 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 https://ipecho.net/plain вернет обычный текстовый внешний IP-адрес.

Более быстрая альтернатива — запросить известный DNS-сервер, например:

dig @ns1-1.akamaitech.net ANY whoami.akamai.net +short
person ccpizza    schedule 08.07.2014
comment
как получить ip-адрес локальной сети? - person diEcho; 26.08.2017
comment
Если вы хотите, чтобы IP-номера разделялись строками в Linux, вам не нужен цикл for, но вы можете просто выполнить hostname -I | xargs -rn1 echo. - person Mikko Rantalainen; 17.12.2020

hostname -I  

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

person Vignajeth    schedule 06.07.2017
comment
по сравнению с количеством уже существующих (и получивших большое количество голосов) ответов, я не думаю, что этот ответ добавит какую-либо ценность... - person Mischa; 06.07.2017
comment
также на имени хоста Centos -I (верхний регистр i) - person zzapper; 10.01.2018
comment
это действительно помогло мне - отмеченная заглавная буква «i» была ключевой - person ChronoFish; 18.04.2018
comment
То же самое, это делает работу отлично без дополнительных инструментов и не нужно вызывать пятнадцать двоичных файлов подряд для очистки вывода. Спасибо ! - person Ulrar; 12.09.2018

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

hostname -I | awk '{print $1}'
person Da CodeKid    schedule 12.05.2016
comment
Со страницы руководства: [...] Эта опция перечисляет все настроенные адреса на всех сетевых интерфейсах. [...] Не делайте никаких предположений о порядке вывода. Последнее предложение говорит вам, что print $1 может дать вам правильный результат, а может и нет. - person 9769953; 22.07.2019

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

ipconfig getifaddr en0
person Tukan3    schedule 04.08.2014

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

ip -4 addr show dev eth0 | grep inet | tr -s " " | cut -d" " -f3 | head -n 1
person caglar    schedule 09.10.2017
comment
Или даже: ip -o -4 addr show dev eth0 | cut -d' ' -f7 | cut -d'/' -f1 - person Jose Alban; 10.04.2018
comment
Да, ты прав. Но будьте осторожны, если eth0 имеет более одного IP-адреса, это показывает их все. - person caglar; 09.05.2018
comment
bash-4.4# ip -4 addr show dev eth0 | инет | тр -с | вырезать -d -f3 | head -n 1 172.17.0.3/16 Так что не очень хорошо с /16 - person AndyGee; 27.02.2019
comment
Добавляем в цикл еще один: ip -4 addr show eth0 | grep inet | awk '{print $2}' | cut -d'/' -f1. Как для v4, так и для v6: ip addr show eth0 | grep inet | awk '{print $2}' | cut -d'/' -f1 - person Sumit Murari; 01.06.2019
comment
Если имя интерфейса неизвестно (или различается между платформами), но вы ищете частный IP-адрес, то вместо ip -4 addr show eth0 | grep inet выполните: ip -4 addr show | grep 192 - person cyberbird; 05.02.2020
comment
Это также работает ip -4 address show eth0 | awk '/inet/{split($2,a,"/");print a[1];exit}' - person sparks; 13.07.2021

Команда 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:]+'
person Nux    schedule 05.02.2018

Мы можем просто использовать только 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

person zdk    schedule 03.11.2015

Похоже, что в нескольких ответах используется более новая команда ip (замена ifconfig), поэтому вот один, который использует ip addr, grep и awk для простого вывода IPv4-адреса, связанного с интерфейсом wlan0:

ip addr show wlan0|grep inet|grep -v inet6|awk '{print $2}'|awk '{split($0,a,"/"); print a[1]}'

Хотя это и не самое компактное или причудливое решение, его (возможно) легко понять (см. объяснение ниже) и изменить для других целей, например, для получения последних 3 октетов MAC-адреса следующим образом:

ip addr show wlan0|grep link/ether|awk '{print $2}'|awk '{split($0,mac,":"); print mac[4] mac[5] mac[6]}'

Объяснение: ip addr show wlan0 выводит информацию, связанную с сетевым интерфейсом с именем wlan0, которая должна быть примерно такой:

4: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether dc:a6:32:04:06:ab brd ff:ff:ff:ff:ff:ff
    inet 172.18.18.1/24 brd 172.18.18.255 scope global noprefixroute wlan0
       valid_lft forever preferred_lft forever
    inet6 fe80::d340:5e4b:78e0:90f/64 scope link 
       valid_lft forever preferred_lft forever

Затем grep inet отфильтровывает строки, не содержащие "inet" (конфигурация IPv4 и IPv6), а grep -v inet6 отфильтровывает оставшиеся строки, которые содержат "inet6", в результате чего должна получиться одна строка, подобная этой. один:

    inet 172.18.18.1/24 brd 172.18.18.255 scope global noprefixroute wlan0

Наконец, первый awk извлекает поле «172.18.18.1/24», а второй удаляет сокращенную маску сети, оставляя только адрес IPv4.

Кроме того, я думаю, стоит упомянуть, что если вы пишете сценарии, то часто есть много более богатых и/или более надежных инструментов для получения этой информации, которые вы, возможно, захотите использовать вместо этого. Например, при использовании Node.js ipaddr-linux, при использовании Ruby < a href="https://github.com/mabels/linux-ip-parser" rel="nofollow noreferrer">linux-ip-parser и т. д.

См. также https://unix.stackexchange.com/questions/119269/how-to-get-ip-address-using-shell-script

person jacobq    schedule 19.09.2019

Чтобы напечатать только IP-адрес eth0 без другого текста:

ifconfig eth0 | grep -Po '(?<=inet addr:)[\d.]+'

Чтобы определить ваш основной интерфейс (поскольку это может быть не eth0), используйте:

route | grep ^default | sed "s/.* //"

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

ifconfig `route | grep ^default | sed "s/.* //"` \
  | grep -Po '(?<=inet addr:)[\d.]+'
person personal_cloud    schedule 17.07.2019

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

person Andy Forceno    schedule 22.03.2015

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

Это сделало бы трюк на Mac:

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

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

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

person Abdellah Alaoui    schedule 14.11.2017

В 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
person user10101010    schedule 10.08.2018

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

ip route | grep src

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

person Search Info    schedule 03.09.2018
comment
Если у вас несколько интерфейсов, это выдает несколько IP-адресов. Вам нужно выяснить маршрут по умолчанию, если вы хотите IP исходящего интернет-соединения. - person Mikko Rantalainen; 17.12.2020

Я предпочитаю не использовать awk и тому подобное в скриптах. ip имеет возможность вывода в JSON.

Если вы пропустите $interface, вы получите все IP-адреса:

ip -json addr show $interface | \
  jq -r '.[] | .addr_info[] | select(.family == "inet") | .local'
person Tal Zion    schedule 04.03.2020
comment
Мне нравится, как результат команды в структурном формате json, как команда ip. вот еще один способ получить IP-адрес, аналогичный приведенному выше bash ip -j addr show eth0 | jp "[0].addr_info[?family== 'inet'].local | [0]" - person Jack Liu Shurui; 27.07.2020
comment
Обратите внимание, что это работает только с новыми версиями. Например, это не работает на CentOS 7.5. - person Jean Spector; 16.12.2020

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

/sbin/ifconfig $(netstat -nr | tail -1 | awk '{print $NF}') | awk -F: '/inet /{print $2}' | cut -f1 -d ' '
person Jose Martinez Poblete    schedule 21.01.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, Wi-Fi и Ethernet, мой VPN-адрес (на интерфейсе tap0) будет возвращен. Скрипт работает как на Linux, так и на OSX и может принимать аргументы, если вы хотите переопределить IFLIST.

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

person MatthieuP    schedule 09.06.2014

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

person Huan    schedule 17.07.2017
comment
Хорошо, что работает на обоих. Кроме того, вы можете вызвать его с помощью ifconfig en0 или ifconfig eth1 и т. д., если вы знаете, какой интерфейс вам нужен :) - person jaygooby; 10.11.2017

Я пока не вижу ответа с nmcli, который является инструментом командной строки для управления NetworkManager.

Так вот :)

wolf@linux:~$ nmcli device 
DEVICE  TYPE      STATE        CONNECTION 
eth1    ethernet  unavailable  --         
eth0    ethernet  unmanaged    --         
lo      loopback  unmanaged    --         
wolf@linux:~$ 

Если вы хотите получить информацию от определенного сетевого интерфейса (скажем, lo для этого примера)

wolf@linux:~$ nmcli device show lo
GENERAL.DEVICE:                         lo
GENERAL.TYPE:                           loopback
GENERAL.HWADDR:                         00:00:00:00:00:00
GENERAL.MTU:                            65536
GENERAL.STATE:                          10 (unmanaged)
GENERAL.CONNECTION:                     --
GENERAL.CON-PATH:                       --
IP4.ADDRESS[1]:                         127.0.0.1/8
IP4.GATEWAY:                            --
IP4.ROUTE[1]:                           dst = 127.0.0.0/8, nh = 0.0.0.0,>
IP4.ROUTE[2]:                           dst = 127.0.0.1/32, nh = 0.0.0.0>
IP6.ADDRESS[1]:                         ::1/128
IP6.GATEWAY:                            --
IP6.ROUTE[1]:                           dst = ::1/128, nh = ::, mt = 256
IP6.ROUTE[2]:                           dst = ::1/128, nh = ::, mt = 0, >
wolf@linux:~$ 

Но так как вы просто хотите получить IP-адрес, просто отправьте вывод на grep, cut или awk.

Давайте сделаем это шаг за шагом. (Не уверен, что не так, формат образца кода просто не работал для этих трех примеров.)

  1. Получить линию IPv4

    wolf@linux:~$ nmcli устройство показать вот | grep 4.A IP4.АДРЕС[1]: 127.0.0.1/8 wolf@linux:~$

  2. Используйте awk, чтобы получить IP

    wolf@linux:~$ nmcli устройство показать вот | awk '/4.A/ {print $2}' 127.0.0.1/8 wolf@linux:~$

  3. Используйте cut для удаления обозначения CIDR (/8)

    wolf@linux:~$ nmcli устройство показать вот | awk '/4.A/ {print $2}' | вырезать -d / -f1 127.0.0.1 wolf@linux:~$

Там твой ответ.

Обратите внимание, что существует множество способов сделать это с помощью инструментов, которые я только что продемонстрировал.

Давайте повторим команды, которые я использовал.

nmcli device show lo | grep 4.A
nmcli device show lo | awk '/4.A/ {print $2}'
nmcli device show lo | awk '/4.A/ {print $2}' | cut -d / -f1

Пример вывода для этих 3 команд

Выход команды 1

IP4.ADDRESS[1]:                         127.0.0.1/8

Вывод команды 2

127.0.0.1/8

Вывод команды 3

127.0.0.1
person Community    schedule 02.09.2020
comment
nmcli хороший. Его можно почти использовать без дополнительных инструментов. Пожалуйста, рассмотрите возможность обновления ответа с помощью этого более нативного/элегантного метода: nmcli -g IP4.ADDRESS device show lo | cut -d / -f 1 - person Jean Spector; 16.12.2020

IPv4-адрес для маршрута по умолчанию:

ip address show $(ip route | grep "^default " | head -n1 | grep -Po "(?<=dev )[^ ]+") | grep -Po "(?<=inet )[^ /]+"

IPv6-адрес для маршрута по умолчанию:

ip address show $(ip route | grep "^default " | head -n1 | grep -Po "(?<=dev )[^ ]+") | grep -Po "(?<=inet6 )[^ /]+"

Для них требуются только команды ip и grep с поддержкой -P и -o. head -1 требуется, потому что ip route может отображать несколько маршрутов по умолчанию, когда система имеет достаточно сложную настройку сети.

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

ip route | grep -Po '(?<=src )[^ ]+'

or

hostname --all-ip-addresses
person Mikko Rantalainen    schedule 17.12.2020
comment
Можно заменить grep -Po на sed или awk, если существует какая-то система, которая поддерживает команду ip, но не grep -Po. grep -Po не определяется POSIX... но POSIX не определяет никаких сетевых команд, поэтому вы не можете сделать это только с помощью инструментов POSIX. - person Mikko Rantalainen; 17.12.2020

самый простой способ, как сказал Микко

hostname --all-ip-addresses

вывод введите здесь описание изображения

вы также можете сделать это для более подробной информации:

ip route

вывод введите здесь описание изображения

person Yehouda BOUSKILA    schedule 05.03.2021

ip addr|awk '/eth0/ && /inet/ {gsub(/\/[0-9][0-9]/,""); print $2}'

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

person MaXiM    schedule 19.01.2016

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

ifconfig $1|sed -n 2p|awk '{ print $2 }'|awk -F : '{ print $2 }'
person Statham    schedule 24.07.2017
comment
или это: curl ifconfig.me - person Statham; 30.09.2017

При поиске вашего внешнего IP-адреса на хосте с NAT довольно много ответов предлагают использовать методы на основе HTTP, такие как ifconfig.me, например:

$ curl ifconfig.me/ip

На протяжении многих лет я видел, как многие из этих сайтов приходят и уходят, я считаю этот метод на основе DNS более надежным:

$ dig +short myip.opendns.com @resolver1.opendns.com

У меня есть этот удобный псевдоним в моем ~/.bashrc:

alias wip='dig +short myip.opendns.com @resolver1.opendns.com'
person htaccess    schedule 08.07.2019

Эти два способа сработали для меня:

Чтобы получить IP-адрес вашего интерфейса eth0. Замените eth0 в приведенном ниже примере на имя вашего интерфейса. ifconfig eth0 | grep -w "inet" | tr -s " " | cut -f3 -d" "

Использование имени хоста: это даст вам инет, т. е. IP-адрес вашего это. используя -I дам вам значение inet для всех интерфейсов, где бы это значение ни присутствовало.

hostname -i

person Milind    schedule 11.06.2020

Если вы не хотите использовать ifconfig или регулярное выражение...

ip addr | grep eth0 | grep inet | awk '{print $2}' | cut -d"/" -f1
person Miae Kim    schedule 02.11.2020

ip adddr, короткий путь

ip -4 -br addr show enp1s0 | awk -F" " '{print $3}'|cut -d'/' -f1

или сократить

ip -4 -br a s enp1s0 | awk -F" " '{print $3}'|cut -d'/' -f1

должен работать в большинстве современных дистрибутивов Linux

person vpolaris    schedule 25.04.2021

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

person HtmlGifited    schedule 15.08.2013
comment
Возможно, вы пытались сказать hostname -i или hostname -I? - person jlh; 24.05.2018
comment
user@linux:~$ Hostname -L -bash: Hostname: command not found user@linux:~$ 1. Заглавная H неверна 2. Нет такой -L - person ; 17.01.2019

curl ifconfig.co 

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

person Prudhvi Raj Mudunuri    schedule 08.05.2018
comment
Для этого требуется работающее подключение к Интернету, и он вернет ваш общедоступный IP-адрес, который может быть или не быть тем, что вам нужно. - person jlh; 24.05.2018
comment
Если система подключена к Интернету через NAT, она вернет только общедоступный адрес, а не адрес сетевого интерфейса системы. - person SePeF; 08.04.2021