Подтвердить что ты не робот

Способы обнаружения общедоступного IP-адреса в bash

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

https://gist.github.com/4669037

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

4b9b3361

Ответ 2

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

wget -qO- ifconfig.me/ip

Ответ 3

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

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

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

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

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

Ответ 4

Это решение не работает, если вы отстаете от nat или чего-то еще. Это помогает без стороннего сервиса. Он работает, если на нем установлено соединение, например сервер или соединение 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; } )

Ответ 5

Попробуйте выполнить следующую команду:

wget -O - -q icanhazip.com

Ответ 6

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

curl http://shtuff.it/myip/short

Ответ 7

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

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

Bash script:

#!/bin/bash

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

Ответ 8

Использование только 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.

Ответ 9

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

curl checkip.amazonaws.com

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