Найти внутренний IP-адрес с помощью BASH - PullRequest
3 голосов
/ 05 апреля 2011

Мне уже известно о многих способах получения вашего внутреннего IP-адреса (ifconfig, ip addr, / etc / hosts и т. Д.), Но я пытаюсь написать сценарий bash, который всегда будет возвращать внутренний IP-адрес. Проблема в том, что многие однострочные (/ sbin / ifconfig | grep inet | head -1 | sed 's / \: / / | | awk' {print $ 3} ') могут возвращать несколько IP-адресов, и мне нужно различать внутренний вручную.

Я подозреваю, что для компьютера нет разницы между внешним IP-адресом и внутренним IP-адресом, и, следовательно, нет 100% гарантированного способа получения правильного IP-адреса.

Конечным результатом является то, что этот скрипт вернет внутренний IP-адрес, независимо от того, является ли он адресом 192 или адресом 204 и т. Д.

Заранее спасибо.

Ответы [ 4 ]

8 голосов
/ 21 октября 2011

"hostname -i", надеюсь, даст вам тот же результат

5 голосов
/ 05 апреля 2011

Как уже упоминали другие, машина не имеет гарантированного или даже вероятного наличия одного IP-адреса. Я не уверен, что именно вы подразумеваете под «внутренним IP»; иногда это может означать «IP-адрес в локальной сети», то есть интерфейс, который подключается к брандмауэру с поддержкой NAT.

Я думаю, что лучший способ сделать это - подключиться к хосту в сети, которую вы хотите, и использовать адрес, с которого происходит это соединение. Это будет интерфейс, который машина обычно использует для подключения к этой сети. У пользователя Unkwntech была такая же идея на этой теме . Код ниже только что взят из этого ответа.

Я не знаю, действительно ли это квалифицируется как решение "bash", поскольку это всего лишь встроенный скрипт Python, но в любом случае это даст вам локальный IP-адрес, используемый для достижения google.com . Так что это даст вам IP-адрес любого интерфейса, который машина использует для доступа к узлам Интернета.

$ python -c 'import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("google.com", 80))
print s.getsockname()[0]'

Более подходящее решение bash-y может использовать tracepath или аналогичную утилиту.

0 голосов
/ 05 апреля 2011

В пределах частных адресных пространств RFC 1918 машина может иметь каждый адрес в диапазоне 10/8, диапазоне 172.16/12 и диапазоне 192.168/16,всего 17891328 IP-адресов, и все из них будут законными "внутренними" IP-адресами.

О, да, не забудьте IPv6 :) 2 ^ 64 возможных адресов на сеть для одной машины, которая может участвовать в нескольких сетях.

Это также не совсем академично: довольно часто хост-системы VMWare, VirtualBox, QEMU и т. д. имеют несколькоRFC 1918 адресов назначен;один для «обычного использования» и тот, который используется специально для связи с гостевыми операционными системами.Или маршрутизаторы / брандмауэры, они могут иметь дюжину внутренних IP-адресов, специально предназначенных для подсети сети по причинам контроля доступа.

0 голосов
/ 05 апреля 2011

Системы также могут иметь несколько частных IP-адресов. Вы должны ограничить свой поиск по IP-адресам частным IP-адресам. 10.0.0.0/8, 172.16.0.0/12 и 192.168.0.0/16.

...