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


273

Мне нужно найти мой внешний IP-адрес из сценария оболочки. На данный момент я использую эту функцию:

myip () { 
    lwp-request -o text checkip.dyndns.org | awk '{ print $NF }'
}

Но это зависит от того perl-libwww, perl-html-format, perl-html-treeустановлен. Какими еще способами я могу получить свой внешний IP?


8
Что вы подразумеваете под внешним IP? Пока два ответа используют HTTP. Ответ может оказаться IP прокси-сервера вашего провайдера. (Который может быть тем, что вы хотите.)
billpg

@billpg: Я имею в виду IP-адрес маршрутизатора NAT
Евгений Ярмаш

Тогда вам понадобится веб-служба «что такое мой IP», использующая HTTPS. Увы, я не знаю ни одного.
billpg


checkip.amazonaws.com использовать это от известного поставщика
arulraj.net

Ответы:


443

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

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

  1. Протокол ответа DNS стандартизирован (формат останется совместимым).
  2. Исторически службы DNS ( OpenDNS , Google Public DNS и т. Д.), Как правило, живут дольше и являются более стабильными, более масштабируемыми и, как правило, более востребованными, чем любой новый хип-сервис whatismyip.com.
  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, либо запись A. Для того, чтобы предпочитать IPv4 или IPv6 соединение, используйте соответственно опции -4или -6.

Чтобы запрос был адресом IPv4, замените ЛЮБОЙ на A; для IPv6 замените его на. AAAAОбратите внимание, что он может возвращать только адрес, используемый для соединения. Например, при подключении по 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

18
Вы правы, это слишком быстро ..
Рахул Патил

4
@Krinkle, это отличный ответ. Есть ли эквивалент myip.opendns.comв Googles Public DNS?
Каннан Мохан

12
Я обнаружил, что это примерно в 19 раз быстрее, чем curl http://canhazip.com. См. Askubuntu.com/a/427092/2273
Адам Монсен

3
Люблю этот подход «чистый / без зависимостей» гораздо лучше, чем все другие предложения, если только вы не привязаны к порту 80
binaryanomaly

5
Обратите внимание, что в некоторых случаях маршрутизаторы, предоставляющие NAT, также будут транслировать ответы DNS (вы можете взглянуть на wiki.nil.com/Network_address_translation_of_DNS_responses ); в этом случае вы должны вернуться к какому-либо ответу, который рекомендует другой подход, кроме DNS.
Разван Стефанеску

146

ПРИМЕЧАНИЕ. Речь идет о внешнем 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

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

С ncкомандой:

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

или используя externalip:

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:

externalip ftp

Все вышеперечисленное можно запустить, используя мой скрипт externalip :

externalip dns
externalip http
externalip https
externalip telnet
externalip ftp

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

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

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

Ориентиры

HTTP и HTTPS

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

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

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 означают 100% потерю пакетов.)

DNS

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

С помощью:

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

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

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

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

  • resolver1.opendns.com
  • resolver2.opendns.com
  • resolver3.opendns.com
  • resolver4.opendns.com

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

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

  • 0.023с из Варшавы
  • 0,009 с из Амстердама

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

Telnet

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

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

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

FTP

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

Доменные имена

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

Комментарии

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


2
Вы тестировали myip.opendns.comметод DNS как в ответе Кринкля ? В настоящее время кажется, что это победитель по умолчанию из-за того, что он не знает ни о каких других провайдерах для этого метода, но все равно было бы полезно сравнить с другими методами.
Джеймс Хей

@JamesHaigh Спасибо за предложение. Я добавил DNS и другие методы (telnet, ftp) в ответ. Самый быстрый способ - это DNS, использующий непосредственно IP-адрес (вместо имени домена) распознавателя.
rsp

Вы также должны добавить / протестировать canhazip.com / canhazip.com (HTTP и HTTPS).
xxdesmus

Вы можете добавить myip.addr.space в свой список. Я построил это сам, поскольку я не был особенно удовлетворен ни одним из других, которых я видел в то время.
Майкл Хэмптон

Иногда я получаю разные результаты, используя dig +short myip.opendns.com @resolver1.opendns.com(36.86.63.180), dig -4 @ns1-1.akamaitech.net -t a whoami.akamai.net +short(118.98.115.34) и curl http://canhazip.com(36.71.64.71). Как я могу решить, какой из них правильный?
Сутандионо,

80
 curl -s http://whatismijnip.nl |cut -d " " -f 5

Заменен сайт на голландский рабочий.


3
+1 Я знал о whatismyip.com, но не о whatismyip.org, это круто.
Джулиан

Никогда не знал об этом! Отличный сайт!
bbosak

2
@MaciekSawicki Действительно ли -sопция необходима в этом случае? Я попробовал с / без него в своей Fedora 15 - Bash 4.2.10 (1), и это работало в обоих направлениях.
ztank1013

4
Кажется, больше не работает через CLI, но переход на веб-страницу из веб-браузера работает. Я использую openSUSE 12.1 x64.
SaultDon

5
whatismyip.comудалил бесплатный сервис для проверки внешнего IP. Итак, я боюсь, что это больше не правильно. icanhazip.comеще работает.
daSong

54

Начиная с whatsmyip.org и ifconfig.me уже упоминалось:

curl -s icanhazip.com


1
Эти два поддерживают IPv6.
Джош Ли

1
@JoshLee, обратите внимание, что icanhazip также поддерживает ipv6. Кроме того, примечание к OP, все эти curlрешения (хотя и действительные) все еще зависят от внешней библиотеки ( libcurl).
HalosGhost

Еще один: ifcfg.me
Eun

18

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

curl -s http://ifconfig.me

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


5
Это очень медленно . Я часто получаю время отклика более 30 секунд, иногда даже более минуты! Иногда это полсекунды (что все еще много), а потом 15 секунд или около того. Это проверено из разных мест. Смотрите мой ответ для получения дополнительной информации и ориентиров.
rsp

15
wget -O - -q http://whatismyip.org/

3
Я не смог получить свой IP, как это, просто дает его как:<img src='ipimg.php'/>
Yuugian

Работал с приличной магией регулярных выражений, но это было нелегко. Если вы настаиваете на использовании этого сервиса, не забудьте обернуть эту строку в скрипт:$ curl -s http://whatismyip.org | grep -o '\([[:digit:]]\{1,3\}\.\)\{3\}[[:digit:]]\{1,3\}'
syntaxerror

13

Amazon AWS

curl https://checkip.amazonaws.com

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

123.123.123.123

Я люблю его, потому что:

  • он возвращает только открытый текстовый IP, больше ничего
  • от известного провайдера, который вряд ли скоро отключится

9

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

curl curlmyip.com

Это коротко и просто для запоминания.


Для использования в « bashнамерении OP» вы не можете обойтись без -sопции, упомянутой в других ответах.
Серж Строобандт,

3
@SergeStroobandt Да, вы можете. Все, что -sделает переключатель, это запускает его в бесшумном режиме, т.е. сообщения об ошибках не будут отображаться. Так что все сводится к тому, как он хочет, чтобы его скрипт обрабатывал ошибки. Сама команда вернет IP-адрес так же надежно, как и при использовании -s.
Гаррет Фогерли

1
Пока этот сайт был самым надежным в нескольких тестах.
Амос Шапира

9
curl ident.me

ИЛИ ЖЕ

curl ifconfig.me

ИЛИ ЖЕ

curl tnx.nl/ip

ИЛИ ЖЕ

curl ipecho.net/plain

ИЛИ ЖЕ

curl ip.appspot.com

ИЛИ ЖЕ

curl whatismyip.akamai.com

ИЛИ ЖЕ

curl icanhazip.com

ИЛИ ЖЕ

curl wgetip.com

ИЛИ ЖЕ

curl ip.tyk.nu

ИЛИ ЖЕ

curl curlmyip.com

ИЛИ ЖЕ

curl corz.org/ip

ИЛИ ЖЕ

curl bot.whatismyipaddress.com

Ссылка


6
netcat icanhazip.com 80 <<< $'GET / HTTP/1.1\nHost: icanhazip.com\n\n' | tail -n1

Чистый вывод здесь, хотя сайт работает. Есть идеи почему? Я за прокси, если это актуально, но wget icanhazip.comработает.
10

@ l0b0 Попробуйте пропустить | tail -n1часть и посмотреть, что вы получаете от прокси
Евгений Ярмаш

Ничего, просто код выхода 1. То же самое для netcat icanhazip.com 80. Похоже, он игнорирует $http_proxyи друзей, потому что указание прокси и порта -xтолько что привело к зависанию.
10

@ l0b0: netcat proxy 3128 <<<$'GET http://icanhazip.com/ HTTP/1.0\n\n' | tail -n 1для основного HTTP-прокси (при условии, что он работает на порту 3128). Однако вы, очевидно, получите обратно IP-адрес прокси.
tripleee

1
HTTP 1.0 не имеет Host:заголовка запроса - виртуальный хостинг на основе имени был одним из главных улучшений в HTTP 1.1. Либо измените запрос, указав HTTP / 1.1, либо удалите заголовок Host (я рекомендую первый).
CVn

4

Если после прочтения всех этих предложений вы захотите прочитать еще больше, вот, возможно, чрезмерно спроектированный скрипт 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'

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

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


3

Если вы хотите использовать HTTPS, чтобы избежать потенциальных ловушек:

_result=$(wget -qO- https://ipcheckit.com/)
_result="${_result##*Your IP address is<br><b>}"
printf '%s\n' "${_result%%</b></p>*}"

2
Возможно, вы могли бы уточнить, какие потенциальные подводные камни вы избегаете здесь?
Калеб

Домен ipcheckit.com, по-видимому, продается и больше не обслуживает службу отображения IP-адресов.
manatwork

ах, подводные камни пишут только сценарии :)
Ярослав Рахматуллин

@Chris Down техника все еще в силе, вам просто нужен другой сайт с поддержкой SSL, чтобы использовать ее.
Калеб

3

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

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

Чтобы получить IP-адрес в скрипте, просто выполните:

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

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


3

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

wget -q -O - checkip.dyndns.org | sed -e 's/[^[:digit:]\|.]//g'

+1 Несмотря на то, что этот подход выглядел так неуклюже, он несколько раз спас мне жизнь. Потому что интернет не WWW . У вас может быть доступ в Интернет, но вы можете (обычно в серверных комнатах) быть обреченными на консоль без графического интерфейса, и в этом случае важно запомнить наизусть один из URL-адресов службы checkIP. И поскольку это довольно распространенное явление, оно только на первый взгляд компилируется, так как вы, скорее всего, будете помнить DynDNS, а не тот, из которого amazonaws. То есть, если у вас нет способа Google для этого. (даже не lynx).
syntaxerror

3

Поскольку я не полагаюсь на соединение или службу, я использую следующий код, который пытается получить 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

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

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

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


Как nslookupметод относится к digметоду в ответе Кринкля ? Они оба используют DNS, верно? Так могу ли я передать какую-то опцию, чтобы digзаставить ее получать ту же запись DNS, что nslookupи здесь?
Джеймс Хей

Да, вы могли бы использовать, dig +short . @ifcfg.meесли хотите
Eun

2

Я запустил облачный сервис для своей семьи и сделал этот быстрый скрипт, который запускаю 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

1

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

zenity --info --text "$(curl -s icanhazip.com)"

1

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

http://ipof.in/txt

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

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

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


1

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

Используя stunclient (в debian / ubuntu do 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

W3m Plaintext-Browser отлично подходит для bash. Вы можете использовать grepи tailсократить ответ следующим образом:

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


0

Используя запрос 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

1
Почему вы бы порекомендовали один над другим?
Ройма

@roaima Вы правы, решать каждый пользователь.
SebMa
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.