Як я можу отримати свою зовнішню 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

Відповіді:


441

Я рекомендую отримати його безпосередньо з DNS-сервера.

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

  1. Протокол відповіді DNS стандартизований (формат залишатиметься сумісним).
  2. Історично склалося, що сервіси DNS ( OpenDNS , Google Public DNS , ..), як правило, виживають набагато довше і є більш стабільними, масштабованими та, як правило, більш доглянутими, ніж будь-який новий сервіс HTTP 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, або запис 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.comGoogle DNS?
Каннан Мохан

12
Я виявив, що це на 19 разів швидше curl http://canhazip.com. Дивіться askubuntu.com/a/427092/2273
Адам Монсен

3
Любіть цю чистоту / відсутність залежностей підходить набагато краще, ніж усі інші пропозиції, якщо ви не зобов'язані перейти до порту 80
binaryanomomaly

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 dns
externalip http
externalip https
externalip telnet
externalip ftp

Тепер довга історія ...

Існує маса варіантів різних серверів, що надають зовнішній IP, особливо через HTTP, розміщений тут чи деінде.

Я зробив орієнтир, щоб побачити, чи хтось із них кращий за інші, і мене здивували результати. Наприклад, один з найбільш рекомендованих ifconfig.me був майже завжди найповільнішим для мене, іноді потрібні багато секунд для відповіді. Багато хто не працює над HTTPS або не працюють, але мають недійсні сертифікати. У деяких є дуже непослідовні часи реакції.

Орієнтири

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

DNS

Для порівняння тут є часи, які інші методи перевіряли 16.06.2015 з Варшави та Амстердаму.

Використання:

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

зазвичай займає (реальний час настінного годинника) приблизно:

  • 0,035 з Варшави
  • 0,015 з Амстердаму

Насправді є чотири резолюції, які можна використовувати таким чином:

  • resolutionver1.opendns.com
  • resolutionver2.opendns.com
  • resolutionver3.opendns.com
  • resolutionver4.opendns.com

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

Використання 208.67.222.222 - IP-адреса resoluver1.opendns.com замість доменного імені швидше:

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

але, можливо, не буде працювати в майбутньому, якщо IP коли-небудь зміниться (хоча це може бути навряд чи добре відомим DNS-рішенням - можливо, я повинен використовувати IP в моєму сценарії зовнішнього сценарію - будь ласка, прокоментуйте).

Telnet

Telnet з ncабо telnetкомандою (див. Вище) зазвичай займає:

  • 0.103 з Варшави
  • 0,035 з Амстердаму

(Немає помітної різниці між командами ncта telnetкомандами.)

FTP

  • 0,104 з Варшави
  • 0,036 з Амстердаму

Доменні імена

Усі методи будуть швидшими (особливо при першому запуску), коли замість доменних імен даних служб будуть використовуватися 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). Як я можу вирішити, який з них правильний?
Sutandiono

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

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


3
+1 Я знав про whatismyip.com, але не whatismyip.org, це приголомшливо.
Джуліан

Ніколи про це не знав! Чудовий сайт!
ббосак

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

4
Ще один: ip.appspot.com або ip.appspot.com
Lekensteyn

1
Ці два підтримують IPv6.
Джош Лі

1
@JoshLee, зауважте, що icanhazip також підтримує ipv6. Крім того, зауважте до ОП, всі ці curlрішення (хоча й дійсні) все ще залежать від зовнішньої бібліотеки ( libcurl).
HalosGhost

Ще один: ifcfg.me
Ин

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'/>
Юйгійський

Зробив це з деякою пристойною магією регексу, але це було не просто. Якщо ви наполягаєте на користуванні цією послугою, не забудьте $ curl -s http://whatismyip.org | grep -o '\([[:digit:]]\{1,3\}\.\)\{3\}[[:digit:]]\{1,3\}'
зафіксувати

13

Amazon AWS

curl https://checkip.amazonaws.com

Вибірка зразка:

123.123.123.123

Мені це подобається тому що:

  • він повертає просто відкритий IP, нічого іншого
  • це від відомого провайдера, який навряд чи скоро перейде в офлайн

9

Я вважаю за краще використовувати curlmyip.com Це так просто, як:

curl curlmyip.com

Запам'ятати це коротко і просто.


Для використання в bash- намірі ОП - вам не обійтися без -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працює.
l0b0

@ l0b0 Спробуйте пропустити | tail -n1частину і подивіться, що ви отримуєте від проксі
Євген Ярмаш

Нічого, просто вихідний код 1. Ditto for netcat icanhazip.com 80. Схоже, це ігнорує $http_proxyі друзів, оскільки конкретизація проксі і порту -xщойно призвела до зависання.
l0b0

@ 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, або видаліть заголовок хоста (рекомендую перший).
CVn

4

Якщо після прочитання всіх цих пропозицій ви хочете прочитати ще більше, ось напевно надмірно розроблений сценарій Баша.

Він містить список серверів 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-адрес.
манатство

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

@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

Це завжди працює для мене, я використовую це в своєму конкі, щоб отримати свою IP-адресу.

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

+1 Не дивлячись на такий незграбний, такий підхід для мене теж спасав життя. Тому що Інтернет - це не WWW . Ви можете мати доступ до Інтернету, але ви можете (як правило, в серверних кімнатах) бути приречені на консоль, що не має GUI, і в цьому випадку важливо запам’ятати напам’ять одну з URL-адрес служби перевірки. Оскільки ця є досить поширеною, вона лише начебто складна, оскільки ви, швидше за все, запам’ятаєте DynDNS, ніж один із amazonaws. Тобто, якщо у вас немає способу Google для цього. (навіть не lynx).
синтаксичний помилок

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якщо ви хочете
Ин

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 чудово підходить для гри. Ви можете використовувати 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

@roaima Ви маєте рацію, кожен користувач повинен вирішити.
SebMa
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.