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

Вы, вероятно, хотите использовать D. Переместите курсор в первый символ, который Вы хотите удалить, затем поразить shift-D. Все уведенное. На самом деле это находится в буфере сокращения по умолчанию, таким образом, Вы можете, P или p вставить его въезжают задним ходом.

Я использую Разность потенциалов (удалите к концу строки, затем отложите ее), переместитесь в конец некоторой другой строки, затем p снова для вставки того же текста в в конце этой другой строки. Творит чудеса в файлах конфигурации, куда необходимо поместить некоторый сложный URL в два или больше места.

282
28.06.2016, 02:33
27 ответов

Я рекомендовал бы получить его непосредственно от сервера DNS.

Большинство других ответов ниже всех включает переходящий через HTTP к удаленному серверу. Некоторые из них потребовали парсинга вывода или полагались на заголовок Агента пользователя, чтобы заставить сервер ответить в простом тексте. Они изменяются вполне часто (спуститесь, измените их имя, поднимите рекламу, мог бы изменить выходной формат и т.д.).

  1. Протокол ответа DNS стандартизирован (формат останется совместимым).
  2. Исторически, сервисы DNS (OpenDNS, Google Public DNS..) имеют тенденцию выживать намного дольше и более стабильны, более масштабируемы, и обычно более заботятся, чем любое новое бедро whatismyip.com, сервис HTTP является горячим сегодня.
  3. Этот метод по сути быстрее (быть этим только несколькими миллисекундами!).

Используя dig с OpenDNS как сопоставитель:

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

Возможно, исказите его в Вашем bashrc таким образом, легко помнить

alias wanip='dig @resolver1.opendns.com ANY myip.opendns.com +short'

Отвечает простым IP-адресом:

$ wanip
80.100.192.168 # or, 2606:4700:4700::1111

Синтаксис

(Сокращенный из https://ss64.com/bash/dig.html):

usage:  dig [@global-dnsserver] [q-type] <hostname> <d-opt> [q-opt]

    q-type   one of (A, ANY, AAAA, TXT, MX, ...). Default: A.

    d-opt    ...
             +[no]short          (Display nothing except short form of answer)
             ...

    q-opt    one of:
             -4                  (use IPv4 query transport only)
             -6                  (use IPv6 query transport only)
             ...

ANY тип запроса возвращает или AAAA или запись. Для предпочтения IPv4 или соединения IPv6 а именно, используйте -4 или -6 опции соответственно.

Для требования ответа быть адресом IPv4 замените ЛЮБОГО A; для IPv6, замена это с AAAA.Note, что это может только возвратить адрес, используемый для соединения. Например, при соединении по IPv6, это не может возвратить адрес.

Альтернативные серверы и примеры

В дополнение к OpenDNS существуют подобные услуги DNS, предоставленные Akamai и Google:

$ dig @ns1-1.akamaitech.net ANY whoami.akamai.net +short
80.100.192.168

$ dig @ns1.google.com TXT o-o.myaddr.l.google.com +short
"80.100.192.168"

Псевдоним в качестве примера, который конкретно запрашивает адрес IPv4:

alias wanip4='dig @resolver1.opendns.com A myip.opendns.com +short -4'

$ wanip4
80.100.192.168

И для IPv6:

alias wanip6='dig @resolver1.opendns.com AAAA myip.opendns.com +short -6'

$ wanip6
2606:4700:4700::1111

Поиск и устранение неисправностей

Если команда не работает по некоторым причинам, может быть проблема с восходящим поставщиком, инструментом командной строки или чем-то еще. Чтобы помочь понять, почему это не работает, выполняет команду без +short опция показать детали запроса DNS. Например:

$ dig @resolver1.opendns.com ANY myip.opendns.com

;; Got answer: ->>HEADER<<- opcode: QUERY, status: NOERROR

;; QUESTION SECTION:
;myip.opendns.com.      IN  ANY

;; ANSWER SECTION:
myip.opendns.com.   0   IN  AAAA    2606:4700:4700::1111

;; Query time: 4 msec
;; WHEN: Fri Apr 11 00:00:01 GMT 2011
451
27.01.2020, 19:26
  • 1
    , Вы правы, что это слишком быстро.. –  Rahul Patil 09.07.2013, 19:24
  • 2
    @Krinkle это - превосходный ответ. Есть ли эквивалент для myip.opendns.com в Гуглит Общественность DNS? –  Kannan Mohan 26.10.2014, 07:11
  • 3
    я нашел, что это было ~19x быстрее, чем curl http://canhazip.com. Посмотрите, что askubuntu.com/a/427092/2273 –  Adam Monsen 10.03.2015, 23:09
  • 4
    Любите это убирает / никакие зависимости не приближаются намного лучше, чем все другие предложения, если Вы не обязаны портировать, 80 –  binaryanomaly 14.03.2015, 17:27
  • 5
    Обратите внимание на то, что в некоторых случаях маршрутизаторы, которые обеспечивают NAT, также переведут ответы DNS (можно смотреть на wiki.nil.com/Network_address_translation_of_DNS_responses); в этом случае Вы должны нейтрализация к некоторому ответу, который рекомендует другой подход, чем DNS. –  Razvan Stefanescu 30.10.2015, 18:20
netcat icanhazip.com 80 <<< $'GET / HTTP/1.1\nHost: icanhazip.com\n\n' | tail -n1
6
27.01.2020, 19:26
  • 1
    Пустой вывод здесь, хотя сайт работает. Какая-либо идея, почему? Я нахожусь позади прокси, если это релевантно, но wget icanhazip.com работы. –  l0b0 04.04.2013, 14:23
  • 2
    @l0b0 опустить | tail -n1 часть и видит то, что Вы получаете от –  Eugene Yarmash 04.04.2013, 16:18
  • 3
    Ничто, просто код выхода 1. Так же для netcat icanhazip.com 80. Похож на него, игнорирует $http_proxy и друзья, потому что, указывая прокси и порт с -x просто привел к процессу зависания. –  l0b0 04.04.2013, 17:05
  • 4
    @l0b0: netcat proxy 3128 <<<$'GET http://icanhazip.com/ HTTP/1.0\n\n' | tail -n 1 для основного Прокси HTTP (принимающий это работает на порте 3128). Вы, очевидно, вернете IP-адрес прокси, все же. –  tripleee 04.07.2013, 07:07
  • 5
    HTTP 1.0 не имеет Host: заголовок запроса - основанный на имени виртуальный хостинг был одним из основных улучшений HTTP 1.1. Или измените запрос, чтобы указать HTTP/1.1 или удалить заголовок Хоста (я рекомендую первому). –  a CVn 04.07.2013, 10:39

Можно использовать ifconfig.me в качестве альтернативы whatismyip.org.

curl -s http://ifconfig.me

Также ifconfig.me имеет некоторых дополнительных функциональный. Для обнаружения, какую информацию можно получить, посещают веб-сайт.

18
27.01.2020, 19:26
wget -O - -q http://whatismyip.org/
15
27.01.2020, 19:26
  • 1
    я не смог получить свой IP как это, просто дает его как:<img src='ipimg.php'/> –  Yuugian 04.04.2013, 16:38
  • 2
    Получил его работающий с некоторой достойной партией regex волшебства, но это не было легко. Если Вы настаиваете на том, чтобы использовать этот сервис, несомненно, перенесут ту строку в сценарий: $ curl -s http://whatismyip.org | grep -o '\([[:digit:]]\{1,3\}\.\)\{3\}[[:digit:]]\{1,3\}' –  syntaxerror 01.02.2016, 04:40
 curl -s http://whatismijnip.nl |cut -d " " -f 5

Замененный сайт с нидерландским языком, работающим один.

82
27.01.2020, 19:26
  • 1
    +1, который я знал о whatismyip.com, но не whatismyip.org, это является потрясающим. –  Julian 14.10.2011, 18:15
  • 2
    Никогда не знал о том! Большой сайт! –  bbosak 15.10.2011, 01:48
  • 3
    @MaciekSawicki -s опция, действительно необходимая в этом случае? Я попробовал им в своей мягкой фетровой шляпе 15 - колотят 4.2.10 (1), и это работало обоими способами. –  ztank1013 15.10.2011, 17:05
  • 4
    Кажется, больше не работает через CLI, но идущий в веб-страницу от веб-браузера работает. Я использую openSUSE 12.1 x64. –  SaultDon 16.08.2012, 19:13
  • 5
    whatismyip.com удалил бесплатный сервис проверить внешний IP. Так, я боюсь, что это больше не корректно. icanhazip.com все еще работы. –  daSong 17.01.2013, 12:20

Так как whatsmyip.org и ifconfig.me были уже упомянуты:

curl -s icanhazip.com
55
27.01.2020, 19:26

Если Вы хотите использовать HTTPS для предотвращения некоторых потенциальных ловушек:

_result=$(wget -qO- https://ipcheckit.com/)
_result="${_result##*Your IP address is<br><b>}"
printf '%s\n' "${_result%%</b></p>*}"
3
27.01.2020, 19:26
  • 1
    Возможно, Вы могли уточнить то, что потенциальные ловушки - то, что Вы избегаете здесь? –  Caleb 17.10.2012, 09:27
  • 2
    Домен ipcheckit.com, по-видимому, продается и не больше размещает сервис отображения IP-адреса. –  manatwork 17.01.2013, 13:59
  • 3
    ах, ловушки сценариев :) –  Ярослав Рахматуллин 04.07.2013, 17:07
  • 4
    @Chris Вниз, техника все еще допустима, Вам просто нужен другой SSL способный сайт для использования его с. –  Caleb 25.11.2013, 23:09

Вот другая альтернатива, которая зависит от хостов, кто бизнес-твердость вокруг управления динамическим IP скорее, что сайты "услуг общего пользования", которые могут уйти или изменить формат.

  1. Зарегистрируйте свой сервер в одном из многих бесплатных динамических сервисов DNS (например, no-ip.com), Это даст Вам запись DNS как xxx.no-ip.org.
  2. Установите динамический инструмент обновления сервиса (сообщают изменения IP сервису).

Для получения IP-адреса в сценарии просто сделайте:

external_ip=`dig +short xxx.no-ip.org`

Большой для использования в задании крона проверить, изменился ли динамический IP и некоторые записи конфигурации должны быть изменены.

3
27.01.2020, 19:26

Используйте завихрение для удара IP сервиса shtuff.it

curl -s https://shtuff.it/myip/short
0
27.01.2020, 19:26

Это всегда работает на меня, я использую его в своем носатом для получения моего IP-адреса.

wget -q -O - checkip.dyndns.org | sed -e 's/[^[:digit:]\|.]//g'
3
27.01.2020, 19:26
  • 1
    +1, Хотя выглядя настолько неуклюжим, этот подход был спасителем для меня слишком несколько раз. Поскольку Интернетом не является WWW. У Вас может быть доступ в Интернет, но Вы можете (обычно в серверных) быть обреченными на консоль не-GUI, и в этом случае важно помнить наизусть один из checkIP сервиса URL. И поскольку этот довольно распространен, это только по-видимому сложно, поскольку Вы, более вероятно, будете помнить DynDNS один, чем тот amazonaws. Таким образом, если у Вас нет способа погуглить для него. (даже lynx). –  syntaxerror 01.02.2016, 04:24

Я предпочитаю использовать curlmyip.com, Это столь же просто как:

curl curlmyip.com

Это коротко и просто помнить.

8
27.01.2020, 19:26
  • 1
    Для использования в bash — намерение OP — Вы не можете обойтись без -s опция упоминается в других ответах. –  Serge Stroobandt 20.07.2014, 14:53
  • 2
    @SergeStroobandt Да Вы можете. Весь -s переключатель делает выполняется это в "тихом" режиме, т.е. сообщения об ошибках не будут отображены. Таким образом, это сводится, как он хочет, чтобы его сценарий обработал ошибки. Сама команда возвратит IP-адрес так же надежно как использование -s. –  Garrett Fogerlie 25.07.2014, 01:48
  • 3
    До сих пор, этот сайт был самым надежным в нескольких тестах. –  Amos Shapira 12.12.2014, 11:05
curl ident.me

OR

curl ifconfig.me

OR

curl tnx.nl/ip

OR

curl ipecho.net/plain

OR

curl ip.appspot.com

OR

curl whatismyip.akamai.com

OR

curl icanhazip.com

OR

curl wgetip.com

OR

curl ip.tyk.nu

OR

curl curlmyip.com

OR

curl corz.org/ip

OR

curl bot.whatismyipaddress.com

Reference

8
27.01.2020, 19:26

Так как я не полагаюсь ни на соединение, ни на службу, я использую следующий код, который пытается получить IP, используя различные службы (не стесняйтесь добавить больше):

# Get my ip address and put in a file
declare -a arr=("ipecho.net/plain" "ident.me" "tnx.nl/ip" "ip.appspot.com" "https://shtuff.it/myip/short/")
IP=$(curl -s --retry 3 --retry-delay 10 ipecho.net/plain)

while [ -z "$IP" ] # If no IP found yet, keep trying!
do
    sleep 30
    IP=$(curl -s --retry 3 --retry-delay 10 ${arr[$((  RANDOM % ${#arr[@]}  ))]})  
done

echo -n "$IP" >  /root/clientIP.txt #puts ip address in clientIP.txt
echo "Our address is $IP" 

Для добавления большей надежности (например если одна из служб изменит свой формат), вы можете проверить, что $IP является действительным IP, используя следующую функцию :

# Verify that the parameter passed is an IP Address:
# http://zindilis.com/blog/2013/05/10/bash-check-that-string-is-ip.html
# @Author: Marios Zindilis
# @License: Creative Commons Attribution-ShareAlike 4.0 International License.
# @Date: 2013-05-10
function is_IP() {
if [ `echo $1 | grep -o '\.' | wc -l` -ne 3 ]; then
        echo "Parameter '$1' does not look like an IP Address (does not contain 3 dots).";
        exit 1;
elif [ `echo $1 | tr '.' ' ' | wc -w` -ne 4 ]; then
        echo "Parameter '$1' does not look like an IP Address (does not contain 4 octets).";
        exit 1;
else
        for OCTET in `echo $1 | tr '.' ' '`; do
                if ! [[ $OCTET =~ ^[0-9]+$ ]]; then
                        echo "Parameter '$1' does not look like in IP Address (octet '$OCTET' is not numeric).";
                        exit 1;
                elif [[ $OCTET -lt 0 || $OCTET -gt 255 ]]; then
                        echo "Parameter '$1' does not look like in IP Address (octet '$OCTET' in not in range 0-255).";
                        exit 1;
                fi
        done
fi

return 0;
}
3
27.01.2020, 19:26

Я запускаю облачный сервис для своей семьи и сделал этот быстрый скрипт, который я запускаю в cron каждое утро в 5, потому что я дешёвый и не куплю статический IP.

Он захватывает публичный IP и отправляет его по электронной почте моим пользователям. Сделал его электронным письмом в формате гиперссылки, чтобы моей маме не приходилось набирать порты или что-то еще. Может быть, кто-нибудь другой сможет использовать его.

#!/bin/bash
ipvariable=$(wget http://ipecho.net/plain -O - -q);

echo "Today the location is http://$ipvariable:123456/foldertheyreach" | mail -s   "From your friendly cloud service provider" user1@someemail.com, user2@ect.com
2
27.01.2020, 19:26

У меня установить услугу, которая возвращает IP-адрес как JSON / XML или простой текст. Вы можете найти их здесь

http://ipof.in/txt

То же самое URL с / json и / xml даст вам другие форматы

, если вы хотите, если вы хотите использовать HTTPS, вы можете использовать одни и те же URL с HTTPS префикс. Преимущество в том, что даже если вы на WiFi, вы получите общественный адрес.

Итак, простой псевдоним myip = "Curl https://ipof.in/txt " получит ваш IP

1
27.01.2020, 19:26

Это покажет текущий ip-адрес во всплывающем окне:

zenity --info --text "$(curl -s icanhazip.com)"
1
27.01.2020, 19:26

Обычный текстовый браузер w3m отлично подходит для бэша. Вы можете использовать grep и tail для сокращения ответа следующим образом:

w3m -no-cookie -dump "http://www.whatismyip.com/" | grep -A 1 -m 1 "Your IP:" | tail -n 1
0
27.01.2020, 19:26

ifcfg.me поддерживает:

curl ifcfg.me
nslookup . ifcfg.me
telnet ifcfg.me
ftp ifcfg.me
finger @ifcfg.me

IPv4 и IPv6, еще больше вещей с curl: ifcfg.me/?

3
27.01.2020, 19:26

ПРИМЕЧАНИЕ: Речь идет о внешнем IP-адресе (том, который виден серверам в Интернете при подключении к ним) - если вам нужен внутренний IP-адрес (тот, который используется вашим собственным компьютером для подключений, которые могут отличаться), см. ответ на этот вопрос .

TL;DR - Самые быстрые методы в 2015

Самый быстрый метод с использованием DNS:

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

или с использованием Externalip:

externalip dns

Самый быстрый с использованием HTTP:

curl -s http://whatismyip.akamai.com/

или с использованием externalip:

externalip http

Самый быстрый с использованием HTTPS с действительным сертификатом:

curl -s https://4.ifcfg.me/

или с использованием externalip:

externalip https

Using telnet:

С помощью nc команды:

nc 4.ifcfg.me 23 | grep IPv4 | cut -d' ' -f4

или с помощью экстернайпа:

externalip telnet

С помощью telnet команды:

telnet 4.ifcfg.me 2>&1 | grep IPv4 | cut -d' ' -f4

Использование FTP:

echo close | ftp 4.ifcfg.me | awk '{print $4; exit}'

или с помощью экстернайпа:

externalip ftp

Все вышеперечисленное может быть запущено с помощью моего сценария экстернайпа в виде:

externalip dns
externalip http
externalip https
externalip telnet
externalip ftp

Теперь это длинная история. ..

Существует множество вариантов различных серверов, обеспечивающих внешний IP, особенно через HTTP, размещенный здесь или в другом месте.

Я сделал бенчмарк, чтобы увидеть, если любой из них лучше, чем другие, и я был удивлен результатами. Например, один из наиболее рекомендуемых ifconfig.me почти всегда был самым медленным для меня, иногда на ответ уходило много секунд. Многие не работают по HTTPS или работают, но имеют недействительные сертификаты. Некоторые имеют очень непоследовательное время отклика.

Benchmarks

HTTP и HTTPS

Это источник моего скрипта с внешними штемпелями, который я использовал:

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

wget https://raw.githubusercontent.com/rsp/scripts/master/externalip-benchmark
chmod a+x externalip-benchmark
./externalip-benchmark

Мои результаты, которые я получил на 2015-04-03 из Варшавы - адреса были изменены, чтобы защитить невинных:

Лучшее время отклика http:

0.086s http://ip.tyk.nu/ - answer='172.31.133.7'
0.089s http://whatismyip.akamai.com/ - answer='172.31.133.7'
0.091s http://tnx.nl/ip - answer='172.31.133.7'
0.117s http://ifcfg.me/ - answer='172.31.133.7'
0.156s http://l2.io/ip - answer='172.31.133.7'
0.317s http://ip.appspot.com/ - answer='172.31.133.7'
0.336s http://ident.me/ - answer='172.31.133.7'
0.338s http://ipof.in/txt - answer='172.31.133.7'
0.347s http://icanhazip.com/ - answer='172.31.133.7'
0.496s http://curlmyip.com/ - answer='172.31.133.7'
0.527s http://wgetip.com/ - answer='172.31.133.7'
0.548s http://curlmyip.com/ - answer='172.31.133.7'
0.665s http://bot.whatismyipaddress.com/ - answer='172.31.133.7'
0.665s http://eth0.me/ - answer='172.31.133.7'
1.041s http://ifconfig.me/ - answer='172.31.133.7'
1.049s http://corz.org/ip - answer='172.31.133.7'
1.598s http://ipecho.net/plain - answer='172.31.133.7'

Лучшее время отклика https:

0.028s https://curlmyip.com/ - answer=''
0.028s https://curlmyip.com/ - answer=''
0.029s https://l2.io/ip - answer=''
0.029s https://tnx.nl/ip - answer=''
0.072s https://whatismyip.akamai.com/ - answer=''
0.113s https://ipecho.net/plain - answer=''
0.117s https://ident.me/ - answer=''
0.207s https://ip.tyk.nu/ - answer='172.31.133.7'
0.214s https://ipof.in/txt - answer='172.31.133.7'
0.259s https://ifcfg.me/ - answer='172.31.133.7'
0.289s https://corz.org/ip - answer=''
0.436s https://ip.appspot.com/ - answer='172.31.133.7'
0.448s https://bot.whatismyipaddress.com/ - answer=''
0.454s https://eth0.me/ - answer=''
0.673s https://icanhazip.com/ - answer='172.31.133.7'
5.255s https://ifconfig.me/ - answer=''
10.000s https://wgetip.com/ - answer=''

(Примечание: есть некоторые быстрые ответы с пустым содержимым - они являются недействительными. )

Лучшее среднее время пинга:

10.210 //whatismyip.akamai.com/
36.820 //tnx.nl/ip
37.169 //ip.tyk.nu/
39.412 //ipof.in/txt
40.967 //ident.me/
41.257 //ipecho.net/plain
43.918 //ifcfg.me/
45.720 //l2.io/ip
64.749 //ip.appspot.com/
123.412 //corz.org/ip
134.245 //wgetip.com/
157.997 //icanhazip.com/
161.613 //curlmyip.com/
162.100 //curlmyip.com/
268.734 //ifconfig.me/
999999 //bot.whatismyipaddress.com/
999999 //eth0.me/

Вот результаты, которые я получил на 2015-04-03 из Амстердама:

Лучшее время отклика http:

0.021s http://ipecho.net/plain - answer='172.31.13.37'
0.027s http://tnx.nl/ip - answer='172.31.13.37'
0.035s http://whatismyip.akamai.com/ - answer='172.31.13.37'
0.039s http://ifcfg.me/ - answer='172.31.13.37'
0.045s http://l2.io/ip - answer='172.31.13.37'
0.142s http://ident.me/ - answer='172.31.13.37'
0.144s http://ipof.in/txt - answer='172.31.13.37'
0.150s http://ip.appspot.com/ - answer='172.31.13.37'
0.150s http://ip.tyk.nu/ - answer='172.31.13.37'
0.170s http://icanhazip.com/ - answer='172.31.13.37'
0.190s http://eth0.me/ - answer='172.31.13.37'
0.191s http://wgetip.com/ - answer='172.31.13.37'
0.301s http://curlmyip.com/ - answer='172.31.13.37'
0.330s http://bot.whatismyipaddress.com/ - answer='172.31.13.37'
0.343s http://curlmyip.com/ - answer='172.31.13.37'
0.485s http://corz.org/ip - answer='172.31.13.37'
3.549s http://ifconfig.me/ - answer='172.31.13.37'

Лучшее время отклика https:

0.004s https://curlmyip.com/ - answer=''
0.012s https://curlmyip.com/ - answer=''
0.012s https://tnx.nl/ip - answer=''
0.016s https://ipecho.net/plain - answer=''
0.071s https://whatismyip.akamai.com/ - answer=''
0.096s https://ifcfg.me/ - answer='172.31.13.37'
0.097s https://ident.me/ - answer=''
0.187s https://corz.org/ip - answer=''
0.187s https://ip.appspot.com/ - answer='172.31.13.37'
0.189s https://ip.tyk.nu/ - answer='172.31.13.37'
0.195s https://eth0.me/ - answer=''
0.253s https://l2.io/ip - answer=''
0.300s https://ipof.in/txt - answer='172.31.13.37'
0.324s https://bot.whatismyipaddress.com/ - answer=''
0.512s https://icanhazip.com/ - answer='172.31.13.37'
1.272s https://ifconfig.me/ - answer=''
10.002s https://wgetip.com/ - answer=''

Лучшее среднее время пинга:

1.020 //ipecho.net/plain
1.087 //whatismyip.akamai.com/
5.011 //ip.appspot.com/
6.942 //ident.me/
7.017 //ipof.in/txt
8.209 //tnx.nl/ip
11.343 //ip.tyk.nu/
12.647 //ifcfg.me/
13.828 //l2.io/ip
81.642 //icanhazip.com/
85.447 //wgetip.com/
91.473 //corz.org/ip
102.569 //curlmyip.com/
102.627 //curlmyip.com/
247.052 //ifconfig.me/
999999 //bot.whatismyipaddress.com/
999999 //eth0.me/

(999999 pings означает потерю 100% пакетов.)

DNS

Для сравнения здесь приведены времена, которые другие методы тестируют на 2015-06-16 из Варшавы и Амстердама.

Использование:

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

обычно занимает (реальное время настенных часов) около:

  • 0.035s из Варшавы
  • 0.015s из Амстердама

На самом деле существует четыре резольвера, которые могут быть использованы таким образом:

  • резольвер1. opendns.com
  • resolver2.opendns.com
  • resolver3.opendns.com
  • resolver4.opendns.com

Они все дают одинаковое время отклика в Варшаве и Амстердаме, но в других местах это может быть не так.

Использование 208.67.222.222 - IP resolver1.opendns.com вместо доменного имени быстрее:

  • 0.023s из Варшавы
  • 0.009s из Амстердама

, но может не работать в будущем, если IP когда-либо изменится (хотя это может быть маловероятно для хорошо известного DNS resolver - может быть, мне следует использовать IP в моем Externalip скрипте - пожалуйста, прокомментируйте).

Telnet

Telnet с командой nc или telnet (см. выше) обычно берет:

  • 0.103s из Варшавы
  • 0. 035s из Амстердама

(Заметной разницы между командами nc и telnet нет)

FTP

  • 0.104s из Варшавы
  • 0. 036s из Амстердама

Domain names

Все методы будут работать быстрее (особенно при первом запуске), когда вместо доменных имен сервисов будут использоваться IP-адреса (за исключением HTTP, который может использовать виртуальные серверы на базе хоста и не работать с голыми IP - не тестируется), но перестанут работать, когда сервисы поменяют IP-адрес, так что это может быть быстрее, но менее перспективно.

Комментарии

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

152
27.01.2020, 19:26

В качестве альтернативы вы можете использовать STUN, который был изобретен для автоматизированного ответа на этот вопрос и широко используется в интернет-коммуникациях, например, SIP и WebRTC.

Используя stunclient (на debian/ubuntu выполните apt-get install stuntman-client), просто сделайте:

$ stunclient stun.services.mozilla.com
Binding test: success
Local address: A.B.C.D:42541
Mapped address: W.X.Y.Z:42541

где A.B.C.D - IP-адрес вашей машины в локальной сети, а W.X.Y.Z - IP-адрес серверов, которые видят веб-сайты извне (и тот, который вы ищете). Используя sed, вы можете свести приведенный выше вывод только к IP-адресу:

stunclient stun.services.mozilla.com |
    sed -ne "s/^Mapped address: \(.*\):.*$/\1/p"

Для альтернативного поиска STUN с использованием только базовых инструментов командной строки см. мой ответ на AskUbuntu (предназначен для развлечения, не для производственного использования).

0
27.01.2020, 19:26

Amazon AWS

curl https://checkip.amazonaws.com

Образец вывода:

123.123.123.123

Мне это нравится, потому что:

  • он возвращает только IP в открытом виде, ничего больше
  • он от известного провайдера, который вряд ли скоро уйдет в офлайн
15
27.01.2020, 19:26

Если после прочтения всех этих предложений вы захотите прочитать еще больше, вот возможно чрезмерно спроектированный сценарий Bash.

Он содержит список DNS- и HTTP-серверов, которые, похоже, работают нормально по состоянию на февраль 2017 года.

Если у вас есть dig , он сначала пробует DNS, что почти на порядок быстрее, чем различные HTTP-сервисы.

Он выходит при первом полученном ответе.

Если у вас нет dig или если все DNS-серверы вышли из строя, он затем пытается использовать службы HTTP, пока не получит ответ.

Серверы перечислены в алфавитном порядке, но перед использованием перемешиваются, чтобы не использовать всегда один и тот же сервер.

#!/bin/bash

## Get my external IP

timeout=2   # seconds to wait for a reply before trying next server
verbose=1   # prints which server was used to STDERR

dnslist=(
    "dig +short            myip.opendns.com        @resolver1.opendns.com"
    "dig +short            myip.opendns.com        @resolver2.opendns.com"
    "dig +short            myip.opendns.com        @resolver3.opendns.com"
    "dig +short            myip.opendns.com        @resolver4.opendns.com"
    "dig +short    -t txt  o-o.myaddr.l.google.com @ns1.google.com"
    "dig +short -4 -t a    whoami.akamai.net       @ns1-1.akamaitech.net"
    "dig +short            whoami.akamai.net       @ns1-1.akamaitech.net"
)

httplist=(
    4.ifcfg.me
    alma.ch/myip.cgi
    api.infoip.io/ip
    api.ipify.org
    bot.whatismyipaddress.com
    canhazip.com
    checkip.amazonaws.com
    eth0.me
    icanhazip.com
    ident.me
    ipecho.net/plain
    ipinfo.io/ip
    ipof.in/txt
    ip.tyk.nu
    l2.io/ip
    smart-ip.net/myip
    tnx.nl/ip
    wgetip.com
    whatismyip.akamai.com
)



# function to shuffle the global array "array"
shuffle() {
   local i tmp size max rand
   size=${#array[*]}
   max=$(( 32768 / size * size ))
   for ((i=size-1; i>0; i--)); do
      while (( (rand=$RANDOM) >= max )); do :; done
      rand=$(( rand % (i+1) ))
      tmp=${array[i]} array[i]=${array[rand]} array[rand]=$tmp
   done
}


## if we have dig and a list of dns methods, try that first
if hash dig 2>/dev/null && [ ${#dnslist[*]} -gt 0 ]; then
    eval array=( \"\${dnslist[@]}\" )
    shuffle

    for cmd in "${array[@]}"; do
        [ "$verbose" == 1 ] && echo Trying: $cmd 1>&2
        ip=$(timeout $timeout $cmd)
        if [ -n "$ip" ]; then
            echo $ip
            exit
        fi
    done
fi


# if we haven't succeeded with DNS, try HTTP

if [ ${#httplist[*]} == 0 ]; then
    echo "No hosts in httplist array!" >&2
    exit 1
fi

# use curl or wget, depending on which one we find
curl_or_wget=$(if hash curl 2>/dev/null; then echo "curl -s"; elif hash wget 2>/dev/null; then echo "wget -qO-"; fi);

if [ -z "$curl_or_wget" ]; then
    echo "Neither curl nor wget found. Cannot use http method." >&2
    exit 1
fi

eval array=( \"\${httplist[@]}\" )
shuffle

for url in "${array[@]}"; do
    [ "$verbose" == 1 ] && echo Trying: $curl_or_wget  "$url" 1>&2
    ip=$(timeout $timeout $curl_or_wget "$url")
    if [ -n "$ip" ]; then
        echo $ip
        exit
    fi
done

Пример использования (я назвал сценарий myip ):

$ myip
Trying: dig +short -t txt o-o.myaddr.l.google.com @ns1.google.com
"151.101.65.69"

$ ip=$(myip); echo "IP = '$ip'"
Trying: dig +short myip.opendns.com @resolver1.opendns.com
IP = '151.101.65.69'

Закомментируйте подробную переменную в верхней части сценария, чтобы не печатать используемый сервер.

Обновление: этот скрипт теперь также находится на Github, где я могу обновлять его при необходимости:
https://github.com/mivk/myip

5
27.01.2020, 19:26

Использование DNS-запроса даже за NAT-маршрутизатором, транслирующим DNS-адреса, может работать:

$ dig +short -t txt o-o.myaddr.l.google.com @ns1.google.com | cut -d'"' -f2
x.y.z.t

или вместо этого вы можете использовать метод HTTP-запроса:

$ curl -s ipinfo.io/ip
x.y.z.t
0
27.01.2020, 19:26

Если у кого-то из вас есть веб-сервер -с выходом в Интернет, вы можете просто создать простую страницу, на которой будет отображаться IP-адрес запрашивающей стороны, например. в PHP:

<?php

    echo $_SERVER['REMOTE_ADDR'];   

?>

Разверните это на своем сервере. например. в http://mydomain.com/whatismyip.phpЗатем используйте стандартный трюк с завитком, чтобы получить его:

curl -s http://mydomain.com/whatismyip.php

Обратите внимание, что если ваш сервер выполняет какие-либо перенаправления (, например, с HTTP на HTTPS ), вы получите ответ о перенаправлении, а не ваш IP-адрес. Поэтому правильно обращайтесь с запросом на завивание.

Преимущество такого подхода в том, что сервис не будет двигаться или исчезать из-под вас, как это часто бывает с бесплатными сервисами. Недостаток, очевидно, в том, что он, скорее всего, будет медленнее, если только у вас нет высококлассного -хостинга.

1
14.05.2020, 21:52

Только ip.tyk.nu вернул правильный IP по http, без https. Вот еще несколько http-сайтов, которые возвращают наш общедоступный IP-адрес и могут использовать https. Я узнал здесь, что использование https вместо http для беспроводной связи позволит обойти изменение IP-адреса провайдером, как сказали несколько человек. Эрвин Хоффман добавил «кривые» зашифрованные DNS в dnscache, что я мог бы попробовать с помощью dig, так как он у меня есть.

myip ()Функция оболочки для просмотра списка http-сайтов или использования https:

# ~/bin/.bash/.ifaces https://pastebin.com/DiPUdqPJ
 
myip() {
 [[ "$1" =~ -s ]] && s='https://' || s=''
 ( for site in ipaddr.pub/cli ipecho.net/plain icanhazip.com ifconfig.me \
     ipconfig.in/ip ident.me bot.whatismyipaddress.com diagnostic.opendns.com/myip \
      checkip.amazonaws.com trackip.net/ip api.ipify.org tnx.nl/ip ip.tyk.nu \
       l2.io/ip wgetip.com
    do echo "$site "
    wget -qO- ${s}$site
    echo
   done
   wget -qO- ${s}checkip.dyndns.org |\
     sed -n -E '/IP Address/s/^.*:[\t ]+([^<]+).*$/checkip.dyndns.org \n\1/p' ) |\
      sed -n -E '/^$/d;H;${g;s/^[\n]+//;s/( )\n/ /g;p;}'
 wget -qO- ${s}ipinfo.io | sed '1s/.*/ipinfo.io:/;$d;'
}

myip (without https):

ipaddr.pub/cli 166.137.143.2
ipecho.net/plain 166.137.143.2
icanhazip.com 166.137.143.2
ifconfig.me 166.137.143.2
ipconfig.in/ip 166.137.143.2
ident.me 166.137.143.2
bot.whatismyipaddress.com 166.137.143.2
diagnostic.opendns.com/myip 166.137.143.2
checkip.amazonaws.com 166.137.143.2
trackip.net/ip 166.137.143.2
api.ipify.org 166.137.143.2
tnx.nl/ip 166.137.143.2
ip.tyk.nu 107.77.201.2 (without https but this one gets it)
l2.io/ip 166.137.143.2
wgetip.com 166.137.143.2
checkip.dyndns.org 166.137.143.2
ipinfo.io:
  "ip": "166.137.143.2",
  "hostname": "mobile-166-137-143-2.mycingular.net",
  "city": "Dallas",
  "region": "Texas",
  "country": "US",
  "loc": "32.7831,-96.8067",
  "org": "AS20057 AT&T Mobility LLC",
  "postal": "75270",
  "timezone": "America/Chicago",
  "readme": "https://ipinfo.io/missingauth"

myip -s (with https):

ipaddr.pub/cli 107.77.201.2
ipecho.net/plain 107.77.201.2
icanhazip.com 107.77.201.2
ifconfig.me 107.77.201.2
ipconfig.in/ip 107.77.201.2
ident.me 107.77.201.2
bot.whatismyipaddress.com 107.77.201.2
diagnostic.opendns.com/myip 107.77.201.2
checkip.amazonaws.com 107.77.201.2
trackip.net/ip 107.77.201.2
api.ipify.org 107.77.201.2
tnx.nl/ip 107.77.201.2
ip.tyk.nu 107.77.201.2
l2.io/ip 107.77.201.2
wgetip.com 107.77.201.2
ipinfo.io:
  "ip": "107.77.201.2",
  "hostname": "mobile-107-77-201-2.mobile.att.net",
  "city": "Dallas",
  "region": "Texas",
  "country": "US",
  "loc": "32.7831,-96.8067",
  "org": "AS20057 AT&T Mobility LLC",
  "postal": "75270",
  "timezone": "America/Chicago",
  "readme": "https://ipinfo.io/missingauth"
0
26.11.2020, 13:18

вы можете сделать это, используя только bash вот так

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 открывает TCP-сокет для icanhazip и отправляет HTTP-запрос, IP-адрес возвращается в последней непустой -строке возвращаемых данных. (предыдущие строки являются заголовками http)

Это позволяет избежать использования HTTP-клиента, такого как wget или curl.

0
01.01.2021, 05:38

Все приведенные выше ответы предполагают, что локальный компьютер имеет доменное имя, которое может быть разрешено DNS-сервером.

Этот ответ поможет, если

  • у локальной машины нет доменного имени, которое может быть разрешено DNS-сервером
  • вы хотите быть независимым от доменного имени
  • вам нужен IP-адрес локальной сети в локальной сети, а не IP-адрес WAN вашего маршрутизатора

Это можно использовать в сценарии оболочки:

# Determine relevant network interface (e.g. eth0 on Linux, en0 on Mac)
INTERFACE=`ifconfig | grep -Eo '^e[a-z]+0: flags=.*' | grep -Eo '^e[a-z]+0'`
# Determine the external ip on this interface
HOSTIP=`ifconfig $INTERFACE | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*'` 

Однако не работает в Windows.

0
04.02.2021, 13:48

Теги

Похожие вопросы