Как я могу получить внешний IP-адрес в сценарии оболочки?
Мне нужно найти внешний IP-адрес из сценария оболочки. В данный момент я использую эту функцию:
myip () {
lwp-request -o текст checkip.dyndns.org | awk '{print $ NF}'
}
Но это зависит от установленного perl-libwww
, perl-html-format
, perl-html-tree
. Какие еще способы получить внешний IP-адрес?
23 ответа
Я бы рекомендовал получить его непосредственно с DNS-сервера.
Большинство ответов здесь все передают HTTP на удаленный сервер. Некоторые из них требуют разбора вывода или полагаются на заголовок User-Agent, чтобы сервер отвечал простым текстом. Они также часто меняются (спускайтесь, меняйте свое имя, размещайте рекламу, можете изменить формат вывода и т. Д.).
- Протокол ответа DNS стандартизирован (формат будет оставаться совместимым).
- Исторически DNS-сервисы ( OpenDNS , Google Public DNS , ..) имеют тенденцию выживать намного дольше и более стабильны, более масштабируемы и, как правило, более внимательны, чем любой новый hip whatismyip.com Служба HTTP сегодня горячая.
- (Для тех, кто заботится о микро-оптимизации), этот метод должен быть по своей природе быстрее (будь то всего несколько миллисекунд).
Используя dig
с OpenDNS как распознаватель:
dig + short myip.opendns.com @ resolver1.opendns.com
Возможно, это псевдоним в вашем bashrc
, поэтому его легко запомнить
alias wanip = 'dig + short myip.opendns.com @ resolver1.opendns.com'
Отвечает с простым IP-адресом:
$ wanip
80.100.192.168
ПРИМЕЧАНИЕ. Это примерно внешний 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; Выход}'
или с помощью externalip:
externalip ftp
Все вышеперечисленное может быть запущено с помощью внешнего скрипта :
externalip dns
externalip http
externalip https
внешний 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,142 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.015s из Амстердама
Существуют фактически четыре резольвера, которые можно использовать следующим образом:
- resolver1.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-преобразователя - возможно, я должен использовать IP-адрес в моем externalip - прокомментируйте).
Telnet
Telnet с командой nc
или telnet
(см. выше) обычно занимает:
- 0.103s из Варшавы
- 0.035s из Амстердама
(Нет заметной разницы между командами nc
и telnet
.)
FTP
- 0.104s из Варшавы
- 0.036s из Амстердама
Доменные имена
Все методы будут быстрее (особенно при первом запуске), когда будут использоваться IP-адреса вместо доменных имен данных служб (за исключением HTTP, который может использовать виртуальные серверы на основе хоста и не работать с голый IP - не протестирован), но перестанет работать, когда службы изменят IP-адрес, чтобы он мог быть быстрее, но менее надежным.
Комментарии
Если вы видите некоторые интересные результаты из своего местоположения или считаете, что некоторые другие хосты должны быть рекомендованы вместо тех, которые я выбрал, отправьте комментарий. Если отсутствует какая-либо важная служба, прокомментируйте или опубликуйте вопрос в GitHub. Я бы хотел, чтобы этот пост обновлялся с помощью текущего выбора наиболее эффективных сервисов.
curl -s http://whatismijnip.nl | cut -d "" -f 5
Замененный сайт голландским рабочим.
Поскольку whatsmyip.org и ifconfig.me уже были упоминалось:
curl -s icanhazip.com
Вы можете использовать ifconfig.me как альтернативу whatismyip.org.
curl -s http://ifconfig.me
Также ifconfig.me имеет некоторый дополнительный функционал. Чтобы узнать, какую еще информацию вы можете получить, посетите веб-сайт.
wget -O - -q http://whatismyip.org/
Я предпочитаю использовать curlmyip.com. Это просто:
curl curlmyip.com
Это коротко и просто запомнить.
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
Amazon AWS
curl https://checkip.amazonaws.com
Пример вывода:
123.123.123.123
Мне нравится, потому что:
- он возвращает только IP-адрес открытого текста, ничего больше
- это от известного поставщика, который вряд ли скоро отправится в автономный режим.
netcat icanhazip.com 80 <$ 'GET /HTTP /1.1 \ nHost: icanhazip.com \ n \ n' | tail -n1
Если вы хотите использовать HTTPS, чтобы избежать возможных ловушек:
_result = $ (wget -qO- https://ipcheckit.com/)
_result = "$ {_ result ## * Ваш IP-адрес равен <br> <b>}"
printf '% s \ n' "$ {_ result %% </b> </p> *}"
Вот еще одна альтернатива, которая зависит от хостов, бизнес которых разрешает управлять динамическим IP-адресом, а не на сайтах «общедоступной службы», которые могут уйти или изменить формат.
- Зарегистрируйте свой сервер в одной из многочисленных бесплатных динамических служб DNS (например, no-ip.com). Это даст вам запись DNS, например xxx.no-ip.org.
- Установите инструмент динамического обновления службы (сообщает об изменениях в IP-услуге).
Чтобы получить IP-адрес в скрипте, просто выполните:
external_ip = `dig + short xxx.no-ip.org`
Отлично подходит для использования в задании cron, чтобы проверить, изменился ли динамический IP-адрес, и некоторые записи конфигурации необходимо изменить.
Это всегда работает для меня, я использую его в своем conky, чтобы получить свой IP-адрес.
wget -q -O - checkip.dyndns.org | sed -e 's /[^ [: digit:] \ |.] //g'
Поскольку я не полагаюсь на соединение или на службу, я использую следующий код, который пытается получить IP-адрес с помощью разных сервисов (не стесняйтесь добавлять больше):
# Получите мой IP-адрес и вставьте файл
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"] # Если IP не найден, продолжайте пытаться!
делать
сон 30
IP = $ (curl -s -retry 3 --retry-delay 10 $ {arr [$ ((RANDOM% $ {# arr [@]}))]})
сделанный
echo -n "$ IP"> /root/clientIP.txt #puts ip-адрес в clientIP.txt
эхо "Наш адрес $ IP"
Чтобы повысить надежность (например, если одна из служб меняет свой формат), вы можете проверить, что $ IP
является допустимым IP-адресом, используя следующий :
# Убедитесь, что переданный параметр является IP-адресом:
# http://zindilis.com/blog/2013/05/10/bash-check-that-string-is-ip.html
# @Author: Мариос Зиндилис
# @License: Creative Commons Attribution-ShareAlike 4.0 Международная лицензия.
# @ Дата: 2013-05-10
функция is_IP () {
если [`echo $ 1 | grep -o '\.' | wc -l` -ne 3]; тогда
echo "Параметр« $ 1 »не похож на IP-адрес (не содержит 3 точки).";
выход 1;
elif [`echo $ 1 | tr '.' '' | wc -w` -ne 4]; тогда
echo "Параметр« $ 1 »не похож на IP-адрес (не содержит 4 октета).";
выход 1;
еще
для OCTET в `echo $ 1 | tr '.' '' `; делать
если ! [[$ OCTET = ~ ^ [0-9] + $]]; тогда
echo «Параметр« $ 1 »не похож на IP-адрес (октет« $ OCTET »не является числовым).»;
выход 1;
elif [[$ OCTET -lt 0 || $ OCTET -gt 255]]; тогда
echo «Параметр« $ 1 »не похож на IP-адрес (октет« $ OCTET »не в диапазоне 0-255).»;
выход 1;
фи
сделанный
фи
return 0;
}
ifcfg.me поддерживает:
curl ifcfg.me
nslookup. ifcfg.me
telnet ifcfg.me
ftp ifcfg.me
finger @ ifcfg.me
IPv4 и IPv6, еще больше материала с завитком: ifcfg.me/?
Я запускаю облачную службу для своей семьи, и я сделал этот быстрый скрипт, который я запускал в cron
каждое утро в 5, потому что я дешев и не покупаю статический IP-адрес.
Он захватывает публичный IP-адрес и отправляет его своим пользователям. Сделал электронную почту в формате гиперссылки, поэтому моей маме не нужно вводить порты или что-то еще. Может быть, кто-то еще может это использовать.
#! /Bin /Баш
ipvariable = $ (wget http://ipecho.net/plain -O -q);
echo "Сегодня местоположение http: //$ ipvariable: 123456 /foldertheyreach" | mail -s «От вашего дружественного поставщика облачных услуг» [email protected], [email protected]
Если после прочтения всех этих предложений, которые вы хотите прочитать еще больше, вот, возможно, слишком переработанный сценарий Bash.
Он содержит список DNS и HTTP-серверов, которые, похоже, работают нормально с февраля 2017 года.
Если у вас есть dig
, он сначала пытается DNS, что на порядок быстрее, чем различные службы HTTP.
Он выходит при первом ответе, который он получает.
Если у вас нет dig
или если все DNS-серверы потерпели неудачу, он затем пытается использовать HTTP-службы, пока не получит ответ.
Серверы перечислены в алфавитном порядке, но перетасовываются перед использованием, чтобы избежать использования одного и того же.
#! /bin /bash
## Получите мой внешний IP-адрес
timeout = 2 # секунды ожидания ответа перед попыткой следующего сервера
verbose = 1 # печатает, какой сервер использовался для 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
)
#, чтобы перетасовать глобальный массив "array"
shuffle () {
локальный размер i tmp max rand
размер = $ {# массив [*]}
max = $ ((32768 /размер * размер))
для ((i = size-1; i> 0; i--)); делать
while (((rand = $ RANDOM)> = max)); делать :; сделанный
rand = $ ((rand% (i + 1)))
tmp = $ {array [i]} array [i] = $ {array [rand]} array [rand] = $ tmp
сделанный
}
## если у нас есть копать и список методов dns, попробуйте это сначала
если хэш-код 2> /dev /null & & & [$ {# dnslist [*]} -gt 0]; тогда
eval array = (\ "\ $ {dnslist [@]} \")
шарканье
для cmd в "$ {array [@]}"; делать
["$ verbose" == 1] & & & echo Trying: $ cmd 1 & 2
ip = $ (timeout $ timeout $ cmd)
если [-n "$ ip"]; тогда
echo $ ip
Выход
фи
сделанный
фи
# если нам не удалось с DNS, попробуйте HTTP
if [$ {# httplist [*]} == 0]; тогда
echo "Нет хостов в массиве httplist!" > & амп; 2
выход 1
фи
# используйте curl или wget, в зависимости от того, который мы находим
curl_or_wget = $ (если hash curl 2> /dev /null, тогда echo curl; elif hash wget 2 gt; /dev /null, затем echo "wget -qO-"; fi);
если [-z "$ curl_or_wget"]; тогда
echo "Ни завиток, ни wget не найдены. Невозможно использовать метод http." > & амп; 2
выход 1
фи
eval array = (\ "\ $ {httplist [@]} \")
шарканье
для url в "$ {array [@]}"; делать
["$ verbose" == 1] & & & echo Trying: $ curl_or_wget -s "$ url" 1 & 2
ip = $ (timeout $ timeout $ curl_or_wget -s "$ url")
если [-n "$ ip"]; тогда
echo $ ip
Выход
фи
сделанный
Пример использования (я назвал скрипт myip
):
$ myip
Попытка: dig + short -t txt o-o.myaddr.l.google.com @ ns1.google.com
"151.101.65.69"
$ ip = $ (myip); echo "IP = '$ ip'"
Попытка: dig + short myip.opendns.com @ resolver1.opendns.com
IP = '151.101.65.69'
Прокомментируйте переменную verbose
в верхней части скрипта, чтобы избежать печати используемого сервера.
В всплывающем окне отобразится текущий IP-адрес:
zenity -info --text "$ (curl -s icanhazip.com)"
Я установил службу, которая возвращает IP-адрес как JSON /XML или обычный текст. Вы можете найти их здесь.
Тот же URL-адрес с /json и /xml также предоставит вам другие форматы
Если вы хотите HTTPS, вы можете использовать одни и те же URL-адреса с префиксом https. Преимущество состоит в том, что даже если вы находитесь на Wi-Fi, вы получите публичный адрес.
Итак, простой псевдоним myip = "curl https://ipof.in/txt " будет получите свой IP
В качестве альтернативы вы можете использовать STUN который был изобретен, чтобы ответить на этот вопрос автоматическим способом и широко используется в интернет-коммуникациях, например SIP и WebRTC .
Использование stunclient (на debian /ubuntu do apt-get install stuntman-client
) просто:
$ stunclient stun.services.mozilla.com
Проверка привязки: успех
Местный адрес: A.B.C.D .: 42541
Mapped адрес: W.X.Y.Z: 42541
где ABCD
- это IP-адрес вашего компьютера в локальной сети, а WXYZ
- это серверы IP-адресов, такие как веб-сайты, которые видны снаружи (и тот, который вы смотрите для). Используя sed
, вы можете уменьшить вывод выше только на IP-адрес:
stunclient stun.services.mozilla.com |
sed -ne "s /^ Отображенный адрес: \ (. * \):. * $ /\ 1 /p"
Для альтернативного поиска STUN, используя только основные средства командной строки, см. ответил Victor Klos 11 +03002015-10-11T17:33:20+03:00312015bEurope/MoscowSun, 11 Oct 2015 17:33:20 +0300 2015, 17:33:20
W3m Plaintext-Browser отлично подходит для bash. Вы можете использовать grep
и tail
, чтобы сократить ответ следующим образом:
w3m -no-cookie -dump "http://www.whatismyip.com/" | grep -A 1 -m 1 "Ваш IP:" | tail -n 1
Используйте curl для доступа к ip-сервису shtuff.it
curl -s https://shtuff.it/myip/short
Используя 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