Нахождение публичного IP-адреса в сценарии оболочки
Я могу найти свой IP-адрес с помощью команды ifconfig или hostname -i.
Но как мне найти мой публичный IP?
(У меня есть статический публичный IP-адрес, но я хочу узнать его с помощью команды unix)
23 ответа
curl ifconfig.me
curl ifconfig.me/ip
(только для ip)
curl ifconfig.me/all
(для получения дополнительной информации требуется время)
Для получения дополнительной команды посетите: http://ifconfig.me/
Вы можете запросить myip.opendns.com
, из OpenDNS. dig @208.67.222.220 myip.opendns.com
dig @ns1.google.com -t txt o-o.myaddr.l.google.com +short
dig -4 @ns1-1.akamaitech.net -t a whoami.akamai.net +short
dig -4 @resolver1.opendns.com -t a myip.opendns.com +short
Обратите внимание, что вышеперечисленное работает только для IPv4 в настоящее время (кажется, что ни один из этих распознавателей в настоящее время не имеет IPv6, но если вы пропустите -4
и явный -t a
, то вы рискуете сломаться в будущем (за исключением Google txt
, который может фактически работать для IPv6 один день, если должным образом включен Google)).
Обратите внимание, что myip.opendns.com
разрешается только через resolver1.opendns.com
а не с auth1.opendns.com
Итак, они, кажется, совершают некоторые похищения DNS и занимают лидирующие позиции в своем собственном доменном имени! Таким образом, вы не можете использовать его, чтобы найти IP случайного резольвера, так как resolver1.opendns.com
не является авторитетным для myip.opendns.com
,
Обратите внимание, что o-o.myaddr.l.google.com
выглядит как наиболее гибкий и ориентированный на будущее подход; это даже хорошо для проверки того, поддерживает ли ваш преобразователь DNS экспериментальное расширение EDNS0 для клиентской подсети (для которого очень немногие средства распознавания имеют поддержку):
% dig @8.8.8.8 -t txt o-o.myaddr.l.google.com +noall +answer +stats | tail -8
;; global options: printcmd
o-o.myaddr.l.google.com. 60 IN TXT "74.125.189.16"
o-o.myaddr.l.google.com. 60 IN TXT "edns0-client-subnet 88.198.54.0/24"
;; Query time: 13 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Sun Dec 8 20:38:46 2013
;; MSG SIZE rcvd: 114
Очень простой ответ, если у вас есть доступ в интернет:
curl icanhazip.com
Имейте в виду, что доверять сторонним источникам вашего IP может быть проблематично, особенно если ваши действия с этими данными имеют особое значение.
Более надежный способ - выбрать известный, заслуживающий доверия DNS-сервер (в идеале работающий с DNSSEC) и запросить у него имя хоста коробки, при условии, что ваш DNS-сервер содержит такие записи;
dig @trustworthysource.com +short `hostname`
Я написал простой и быстрый веб-сервис для этого.
curl ident.me
Вы можете запросить ваш IPv4:
curl v4.ident.me
Или IPv6:
curl v6.ident.me
И API документирован на http://api.ident.me/
Если
- у вас есть только один публичный IP-адрес и
- вы напрямую подключены к интернету (нет NAT / прокси / VPN и т. д.)
затем вы можете просто проанализировать вывод ifconfig для IP-адресов интерфейсов (часть "inet addr:"), чтобы получить список IP-адресов всех ваших интерфейсов. Один IP-адрес, который не входит в закрытый диапазон (см. http://en.wikipedia.org/wiki/IP_address), является вашим общедоступным IP-адресом.
Тот же список можно получить через
ip addr show
который может быть легче разобрать.
Если у вас нет прямого подключения к Интернету (NAT и т. Д.), Невозможно найти ваш общедоступный IP-адрес без посторонней помощи (так как ваш компьютер его не знает). Тогда вам придется сделать это, как в других ответах.
Я выбрал немного другой подход, используя протокол STUN, который был разработан для NAT Traversal. Если вы используете Ubuntu, вы можете просто установить пакет "stun", набрав:
sudo apt-get install stun
Пакет устанавливает сервер STUN, который вам, вероятно, не понадобится, но также поставляется с тестовым клиентом STUN, который я использовал для решения этой проблемы. Теперь вы можете получить ваш публичный IP с помощью одной (не такой простой) команды:
stun -v stunserver.org 2>&1 1>/dev/null | grep MappedAddress | sed -e 's/.*MappedAddress = //' -e 's/:.*//' | uniq
Теперь, что он делает: stun связывается с общедоступным сервером STUN "stunserver.org" и получает ответ с вашим публичным IP, остальная часть команды просто отфильтровывает IP из вывода.
Одним из способов является, вы можете сделать запрос на странице по адресу
http://www.biranchi.com/ip.php
возвращает IP-адрес вашей системы
Самый простой способ - использовать http://ifconfig.me/, как предлагается.
На этой странице вы узнаете, какую команду использовать для какой информации вы хотите получить.
Для IP:
curl ifconfig.meили же
curl ifconfig.me/ip
Для публичного имени хоста:
curl ifconfig.me/host
Для всей информации в файле XML:
curl ifconfig.me/all.xml
и т.д... просто проверьте http://ifconfig.me/
Google теперь отображает ваш общедоступный IP-адрес: http://www.google.com/search?q=ip
Хорошо... Я знаю, что это ПУТЬ после факта и, вероятно, даже не стоит публиковать, но вот мое рабочее решение.
#!/bin/sh
IP="$(ifconfig | egrep 'inet ' | sed -e 's/inet //' -e 's/addr://' -e 's/ Bcast.*//' -e 's/127.*//')"
echo $IP
Красиво и просто.
Чтобы не полагаться на внешние источники, я использую функцию Telnet к маршрутизатору и получаю IP-адрес его открытого интерфейса. Вот пример ожидаемого скрипта:
#!/usr/bin/expect
if { $argc < 3 } {
puts "usage: ./telnet2router.exp router-ip username password"
return -1
}
set ip [lrange $argv 0 0]
set username [lrange $argv 1 1]
set password [lrange $argv 2 2]
spawn telnet $ip
expect "login:" {
send "$username\r"
}
expect "Password:" {
send "$password\r"
}
expect "#" {
send "ifconfig ppp0 | grep inet\r"
send "exit\r"
}
expect eof
Затем я выполняю приведенный выше скрипт, чтобы получить публичный IP:
./telnet2router.exp <router-ip> <username> <password> | grep "inet addr" | cut -d : -f 2 | cut -d " " -f 1
Конечно, это основано на предположении, что у меня есть доступ администратора к маршрутизатору и маршрутизатору на основе Linux с доступной командой ifconfig.
Я делаю это много и со многих устройств, поэтому я сделал свои собственные две службы на сервере:
PHP-файл в корне веб-сервера:
user@host:~$ cat index.php` <?php echo $_SERVER['REMOTE_ADDR']; echo "\n" ?>
Использование на оболочке:
$ curl -4 mydomain.com 79.22.192.12
также работает с ipv6:
$ curl mydomain.com 2a01:e34:ee7d:180::3
С netcat:
$ echo "GET /" | nc myserver.com 80 2a01:e34:ee7d:180::3
На маршрутизаторе Cisco:
router#more http://myserver.com/index.php 79.22.192.12
быстрый взлом с пользовательским сервером telnet: xinetd spawning /usr/bin/env:
service telnet { server = /usr/bin/env socket_type = stream protocol = tcp flags = IPv6 wait = no port = 23 cps = 3 30 passenv = %a }
а затем телнет к нему:
$ nc -4 myserver.com 23 REMOTE_HOST=::ffff:79.22.192.12 $ nc myserver.com 23 REMOTE_HOST=2a01:e34:ee7d:180::3
работает так же с роутером:
router#telnet myserver.com 79.22.192.12
Таким образом, вы можете заставить его работать во внутренней сети, если в общении участвует какой-то nat или proxy, и вы хотите знать, с какого IP вы появляетесь.
Это не требует никакого стороннего обслуживания.
Простое решение сценария оболочки можно найти здесь:
http://bash.cyberciti.biz/misc-shell/read-local-ip-address/
Работает на Linux, FreeBSD, SunOS и Apple Darwin (с незначительными изменениями).
Если вам нужно найти внешний IP-адрес на вашем маршрутизаторе, вы либо попросите сам маршрутизатор указать его WAN-адрес, либо попросите кого-нибудь снаружи получить его для вас.
для ручного способа вы можете просмотреть любой из указанных выше сайтов, которые будут возвращать IP-адрес входящего запроса.
Для автоматического способа вы можете попробовать:
wget -q -O - http://www.ipaddressworld.com | grep '[0-9]\{1,3\}\.[0-9]\{1,3\}'\.
которая выдаст вам строку, содержащую IP-адрес в ответе http, а затем проанализирует его с помощью sed, awk и т. д.
Дубликат многих других вопросов (отсюда мой -1 голос).
Вот еще одна альтернатива, которая зависит от хостов, которые решают бизнес вокруг управления динамическим IP, а не от сайтов "общего обслуживания", которые могут исчезнуть или изменить формат.
1) Зарегистрируйте свой сервер в одной из многочисленных бесплатных динамических служб DNS (например, no-ip.com). Это даст вам запись DNS, такую как xxx.no-ip.org.
2) Установите инструмент динамического обновления службы (сообщает об изменениях IP в службу).
Чтобы получить IP-адрес в скрипте, просто выполните:
$external_ip = `dig +short xxx.no-ip.org`
Отлично подходит для использования в задании cron, чтобы проверить, изменился ли динамический IP и нужно ли изменить некоторые записи конфигурации.
Я сделаю это. Это просто дает мне IP без какого-либо участия третьих лиц..
ip addr show | grep eth0 | grep inet | tr -s "" | cut -f3 -d "" | cut -f1 -d "/"
Вы можете использовать только оболочку для проверки вашего внешнего ip, также используя внешних провайдеров
#!/bin/bash
TCP_HOST="checkmyip.com"
TCP_PORT=80
exec 5<>/dev/tcp/"${TCP_HOST}"/"${TCP_PORT}"
echo -e "GET / HTTP/1.0\nHOST:${TCP_HOST}\n" >&5
while read -r line
do
case "$line" in
*"Your local IP address is"* )
line="${line#*Your local IP address is }"
line=${line%%</p>*}
echo "Your ip is: $line"
exec >&5-
exit
;;
esac
done <&5
выход
На OS X есть два простых решения для получения как частного, так и публичного IP (с бонусным кодом, если вы используете LaunchBar).
Частный IP
$ ipconfig getifaddr $1
# $1=en0 || en1 || en*
LaunchBar Script
#!/bin/sh
title="$USER@$(HOSTNAME -s)"
text=$(ipconfig getifaddr en1)
open "x-launchbar:large-type?font-name=TerminalDosis-Light&string=$text&title=$title"
Общественный IP
$ dig +time=1 +tries=1 +retry=1 +short myip.opendns.com @resolver1.opendns.com
# ||
$ curl $1
# $1=http://wtfismyip.com/text || http://ip-addr.es || http://icanhazip.com || http://wgetip.com || http://ident.me || http://ifconfig.me || https://shtuff.it/myip/short || http://curlmyip.com
LaunchBar Script
#!/bin/sh
title="$USER@$(HOSTNAME -s)"
text=$(dig +time=1 +tries=1 +retry=1 +short myip.opendns.com @resolver1.opendns.com)
open "x-launchbar:large-type?font-name=TerminalDosis-Light&string=$text&title=$title"
lynx --dump http://www.whatismyip.com/ | grep -o '[0-9].*\.[0-9].*\.[0-9].*\.[0-9].*' -m1
wget -q -O - checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//'