Я ищу решение командной строки, которое возвратило бы мне основной (первый) IP-адрес локального хоста, отличный от 127.0.0.1
Решение должно работать как минимум для Linux (Debian и RedHat) и OS X 10.7+
Я знаю, что ifconfig
доступно на обоих, но его вывод не так согласован между этими платформами.
curl -4 ifconfig.co
. Он ответит вашим внешним IP4-адресом.Ответы:
Используйте
grep
для фильтрации IP-адреса изifconfig
:ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'
Или с
sed
:ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'
Если вас интересуют только определенные интерфейсы, wlan0, eth0 и т. Д., То:
ifconfig wlan0 | ...
Вы можете использовать псевдоним команды в вашем,
.bashrc
чтобы создать свою собственную команду, называемую,myip
например.alias myip="ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'"
Гораздо более простой способ
hostname -I
(hostname -i
для более старых версий,hostname
но см. Комментарии). Однако это только для Linux.источник
-E
опцию Extended RE, а не-r
опцию GNU-style .-E
. Последние версии FreeBSD добавили-r
опцию в качестве псевдонима для-E
облегчения переносимости скриптов, но обновление еще не было перенесено в OSX, в последней проверенной мной версии все еще используется версия sed из релиза FreeBSD несколько лет назад. Не уверен, какой именно, так как OSX несколько раз принимал исходный код FreeBSD несколько лет. Я считаю, что использование-E
было предназначено, чтобы быть сопоставимым сgrep
русским-E
вариантом. Понятия не имею, почему люди GNU выбрали-r
вместо этого.-E
чтобы быть уверенным в переносимости, можно подумать, что--help
иman pages
он будет обновлен ... это действительно вызвало у меня небольшую путаницу ранее в другом вопросе с использованием-E
Следующее будет работать на Linux, но не на OSX.
Это совсем не зависит от DNS и работает, даже если
/etc/hosts
он не установлен правильно (1
сокращенно для1.0.0.0
):или избегать
awk
и использовать общедоступный DNS Google8.8.8.8
для наглядности:Менее надежный способ: (см. Комментарий ниже)
источник
hostname -I
объектом, ненадежен, потому что (согласно документации) нельзя делать какие-либо предположения о порядке адресов. Поэтому вполне может быть какая-то внутренняя сеть (например, сеть, в которой живут виртуальные машины). Другой метод кажется хорошим.ip route get 1 | awk '{print $(NF-2);exit}'
работает, как UID добавлен к выходуip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p'
Для машин Linux (не OS X):
источник
hostname -i
это эквивалентная короткая формаhostname
в GNU Coreutils версии 8.26.hostname -i
выдает только локальный IP, в то время какhostname -I
выдает все остальные IPв Linux
на macOS
hostname -I
может возвращать несколько адресов в ненадежном порядке (см наhostname
странице руководства ), но для меня это просто возвращаю192.168.1.X
, что это то , что вы хотели.источник
hostname -i
с более низким I.-i
флага говорит , что это:Avoid using this option; use hostname -I instead
.Решение
объяснение
Правильный путь к сетевой информации запроса с помощью
ip
:-o
однострочный выходroute get to
получить фактический маршрут ядра к месту назначения8.8.8.8
Google IP, но вы можете использовать реальный IP-адрес, который вы хотите достичьнапример,
ip
вывод:Чтобы извлечь
src
ip,sed
он самый легкий и наиболее совместимый с поддержкой регулярных выражений:-n
по умолчанию не выводится's/pattern/replacement/p'
сопоставлять шаблон и заменять только печать.*src \([0-9.]\+\).*
соответствует src IP, используемому ядром, чтобы достичь8.8.8.8
например, конечный результат:
Другие ответы
Я думаю, что ни один из предыдущих ответов не достаточно хорош для меня, так как они не работают на последней машине (Gentoo 2018).
Проблемы, которые я нашел с предыдущими ответами:
ifconfig
которого устарело и, например, не перечисляет несколько IP-адресов;awk
для простой задачи, с которой sed справится лучше;ip route get 1
неясно, и на самом деле псевдоним дляip route get to 1.0.0.0
hostname
команды, которая не имеет-I
опций во всех устройствах и которые возвращаются127.0.0.1
в моем случае.источник
Отредактировано (
2014-06-012018-01-09)Для более сильной конфигурации, с множеством интерфейсов и множеством IP-адресов, настроенных на каждом интерфейсе, я написал чистый bash- скрипт (не основанный на
127.0.0.1
) для поиска правильного интерфейса и IP-адреса на основеdefault route
. Я размещаю этот сценарий в самом низу этого ответа.вступление
Как обе ОС имеют удар установлен по умолчанию, есть подсказка bash для Mac и Linux:
Проблема локали предотвращается с помощью
LANG=C
:Поместив это в функцию:
Минимальные:
Простое использование:
Причудливая приборка:
Использование:
или, запустив ту же функцию, но с аргументом:
Примечание: без аргумента эта функция выводит на STDOUT, IP и символ новой строки , с аргументом, ничего не печатается, но создается переменная с именем аргумента, которая содержит IP без символа новой строки .
Примечание 2: Это было протестировано на Debian, LaCie, взломанных NAS и MaxO. Если это не сработает в вашей среде, мне будут очень интересны отзывы!
Старая версия этого ответа
(Не удаляется, потому что на основе
sed
нетbash
.)Предупреждаю: есть проблема с локалями!
Быстрый и маленький:
Взорвался (работа тоже;)
Редактировать:
Как! Кажется, это не работает на Mac OS ...
Хорошо, похоже, это работает на Mac OS так же, как на моем Linux :
расщепляется:
Мой сценарий (январь 2018 г.):
Этот сценарий сначала найдет используемый по умолчанию маршрут и используемый интерфейс , а затем выполнит поиск локальной IP-сети, соответствующей шлюзу, и заполнит переменные. Последние две строки просто напечатать, что-то вроде:
или
Ну, вот оно:
источник
sbin
это не$PATH
указывается в моем полном пути, но в MacOS также должен существовать такой же путь. :-)time
чтобы выбрать то, что вы будете использовать так долго ...Специфично только для определенных сборок Ubuntu. Хотя это может просто сказать вам
127.0.0.1
:или
источник
$ hostname --ip-address
просто дает мне127.0.0.1
на Arch LinuxВы также можете получить IP-адрес версии 4 eth0, используя эту команду в Linux
Выход будет такой
источник
Это работает на Linux и OSX
Это получит интерфейс, связанный с маршрутом по умолчанию
Используя интерфейс, обнаруженный выше, получите IP-адрес.
OSX
Дарвинский ноутбук 14.4.0 Darwin Kernel Версия 14.4.0: Четверг, 28 11:35:04 PDT 2015; root: xnu-2782.30.5 ~ 1 / RELEASE_X86_64 x86_64
EN5
192.168.0.130
CentOS Linux
Linux dev-cil.medfx.local 2.6.18-164.el5xen 1 SMP четверг 3 сентября 04:03:03 EDT 2009 x86_64 x86_64 x86_64 GNU / Linux
eth0
192.168.46.10
источник
| head -1
в конце первой строки получить интерфейс по умолчанию, а остальное хорошо.Использование некоторых других методов Вы можете вступить в конфликт, когда в системе определено несколько IP-адресов. Эта строка всегда получает IP-адрес по умолчанию.
источник
Я извлекаю свой комментарий к этому ответу:
Он основан на ответе @CollinAnderson, который не работал в моем случае.
источник
источник
bash
псевдонимом:alias myip="ifconfig | grep 'inet ' | grep -v '127.0.0.1' | awk '{print \$2}'"
Самый короткий способ получить ваш локальный ipv4-адрес в вашей системе Linux:
источник
Предполагая, что вам нужен ваш основной публичный IP, как это видно из остального мира, попробуйте любой из них:
источник
Я должен добавить к ответу Коллина Андерсона, что этот метод также учитывает, если у вас есть два интерфейса, и они оба отображаются как вверх.
Я работал над приложением с Raspberry Pi, и мне нужен был IP-адрес, который фактически использовался, а не только был ли он активен или нет. Большинство других ответов будут возвращать оба IP-адреса, которые не всегда полезны - в любом случае для моего сценария.
источник
Основной сетевой интерфейс IP
источник
Находит IP-адрес этого компьютера в сети, которая является шлюзом по умолчанию (например, исключает все виртуальные сети, док-мосты), например. Интернет-шлюз, Wi-Fi-шлюз, Ethernet
Работает на Linux.
Тест:
источник
источник
Еще один
ifconfig
вариант, который работает как на Linux, так и на OSX:источник
ifconfig | grep '\<inet\>' | cut -d ' ' -f2 | grep -v '127.0.0.1'
Я просмотрел множество ссылок (StackExchange, AskUbuntu, StackOverflow и т. Д.) И пришел к решению объединить все лучшие решения в один сценарий оболочки.
На мой взгляд, эти два QA лучше всего видны:
Как я могу получить свой внешний IP-адрес в сценарии оболочки? https://unix.stackexchange.com/q/22615
Как мне найти свой внутренний IP-адрес? https://askubuntu.com/a/604691
Вот мое решение, основанное на некоторых идеях rsp, опубликованных в его репозитории ( https://github.com/rsp/scripts/ ).
Некоторые из вас могут сказать, что этот сценарий чрезвычайно важен для такой простой задачи, но я бы хотел сделать его максимально простым и гибким в использовании. Он поддерживает простой файл конфигурации, позволяющий переопределить значения по умолчанию.
Он был успешно протестирован под Cygwin, MINGW и Linux (Red Hat).
Показать внутренний IP-адрес
Показать внешний IP-адрес
Исходный код также доступен по ссылке: https://github.com/ildar-shaimordanov/tea-set/blob/master/home/bin/myip . Пример файла конфигурации есть рядом с основным скриптом.
источник
Я просто использую имена сетевых интерфейсов , моя команда
в моей записной книжке
но если сетевой интерфейс владеет хотя бы одним ip, то он покажет все принадлежащие ему ip
например
Ubuntu 16.10
Debian Джесси
CentOS 6,8
Fedora 24
Кажется, что команда,
ip route get 1 | awk '{print $NF;exit}'
предоставляемая ссылкой , более точна, более того, она короче.источник
Не уверен, что это работает во всех ОС, попробуйте.
источник
ip route get 1 | awk '{print $NF;exit}'
. Должно работать на большинстве систем.ip route get 1 | awk '{print $NF;exit}'
работаетСуществует пакет узлов для всего. Это кроссплатформенный и простой в использовании.
Это спорный подход, но использование npm для инструментов становится все более популярным, нравится вам это или нет.
источник
Если вы знаете сетевой интерфейс (eth0, wlan, tun0 и т. Д.):
источник
источник
источник
Работает на Mac, Linux и внутри Docker Containers:
$ hostname --ip-address 2> /dev/null || (ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p' | awk '{print
$ 1; выход}')Также работает
Makefile
как:LOCAL_HOST := ${shell hostname --ip-address 2> /dev/null || (ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p' | awk '{print $1; exit}')}
источник
hostname --ip-address
=>hostname: illegal option -- -
на macOS SierraДля Linux вам нужна эта команда:
введите это в вашей оболочке, и вы просто будете знать свой IP.
источник
Это легче читать:
ifconfig | grep 'inet addr:' |/usr/bin/awk '{print $2}' | tr -d addr:
источник
Если у вас есть
npm
иnode
установлены:npm install -g ip && node -e "const ip = require('ip'); console.log(ip.address())"
источник