it-swarm.com.ru

Методы определения публичного IP-адреса в bash

Как часть сценария установки, я хочу сделать «обоснованное предположение» об IP-адресе машины public. Он должен быть максимально надежным, работать на различных хостах и ​​платформах. Вот пример: 

https://Gist.github.com/4669037

В этом сценарии используются 3 метода, а затем по умолчанию используется значение /etc/hostname. Я только что проверил это на Ubuntu. Будет ли это работать на других дистрибутивах? И есть ли дополнительные методы, которые я мог бы добавить?

23
Jeroen
curl ipinfo.io/ip

Или же

wget -qO- ipinfo.io/ip

Или же

lynx -source ipinfo.io/ip

получить публичный IP-адрес

43
Steven Penny

curl ifconfig.me будет лучшим выбором, если у вас нет curl:

wget -qO- ifconfig.me/ip

9
Kent

Какой публичный публичный IP вы ищете? Что делать, если машина находится за NAT?

  • curl/wget/netcat (nc) <URL>, который содержит адрес запрашивающей стороны: должен работать большую часть времени, но может быть, сайт может быть недоступен с компьютера (будь то брандмауэр или временная/постоянная недоступность). Вы получите самый публичный IP-адрес, какой только сможете.

  • ifconfig: должен запускаться от имени пользователя root, в противном случае вам также придется попробовать /sbin/ifconfig или /usr/sbin/ifconfig. Что делать, если на машине установлено больше сетевых карт? Как вы говорите, какой IP является правильным? Что если в локальной сети устройства используется только IPv6? В любом случае вы получите наименьший общедоступный IP-адрес, который вы можете (и, возможно, неправильный, если на компьютере настроено больше интерфейсов - что часто бывает в наши дни с вездесущей виртуализацией с использованием сетевых отводных устройств и/или).

  • /etc/hostname: не должен существовать, во многих системах это /etc/HOSTNAME, и он не содержит IP-адрес, скорее он должен содержать имя хоста (обычно полное доменное имя).

Дело в том, что способов, которыми он может потерпеть неудачу, множество, и вам, вероятно, следует рассмотреть либо а) более точное указание систем, на которые вы нацеливаетесь, либо б) действительно ли вам нужно знать IP - это решение, которое кажется работать в простых случаях, которые стоит использовать, когда он с треском проваливается при чуть более сложной установке? Если вы считаете, что вам нужен IP, подготовьте способ изящной обработки сбоев в тех случаях, когда вы либо вообще не получаете IP, либо получаете неправильный.

2
peterph

Если на AWS EC2 вы можете использовать:

curl checkip.amazonaws.com

ПРИМЕЧАНИЕ: эта услуга может быть использована из любого веб-клиента.

1
Eric Semwenda

Это решение не работает, если вы находитесь за нат или что-то еще. Помогает без стороннего сервиса. Это работает, если на машине есть соединение, например, сервер или соединение ppp.

  • Не совсем правильный ответ на вопрос, но, вероятно, помогает другим людям (таким как я)
  • Требуется быть root в большинстве (или во всех?) случаях

Вы можете получить (первый) маршрут по умолчанию из route -n, найти используемый интерфейс и найти IP-адрес, который у него есть.

MAINIF=$( route -n | grep '^0\.0\.0\.0' | head -n 1 | awk '{print $NF}' )
IP=$( ifconfig $MAINIF | { IFS=' :';read r;read r r a r;echo $a; } )
1
Furkan Mustafa

Попробуйте эту команду:

wget -O - -q icanhazip.com
1
MCurbelo

Используйте ipify API:

curl 'https://api.ipify.org?format=json'

Bash скрипт:

#!/bin/bash

ip=$(curl -s https://api.ipify.org)
echo "My public IP address is: $ip"
0
RiccardoCh

Используйте curl, чтобы нажать shtuff.it IP-сервис

curl http://shtuff.it/myip/short
0
Chris Montanaro

Использование только bash (с помощью icanhazip.com ):

exec 3<>/dev/tcp/icanhazip.com/80 
echo -e 'GET / HTTP/1.0\r\nhost: icanhazip.com\r\n\r' >&3 
while read i
do
 [ "$i" ] && myip="$i" 
done <&3 
echo "$myip"

bash открывает, открывает сокет для icanhazip и отправляет http-запрос, IP-адрес возвращается в последней непустой строке возвращаемых данных. (предыдущие строки - заголовки http)

Это исключает необходимость использования http-клиента, такого как wget или curl.

0
Jasen