Нахождение публичного IP-адреса в сценарии оболочки


39

Я могу найти свой IP-адрес с помощью команды ifconfig или hostname -i.

Но как мне найти мой публичный IP?

(У меня есть статический публичный IP-адрес, но я хочу узнать его с помощью команды unix)


Вы пытаетесь сделать это программно?
Эндрю Кит

да в сценарии оболочки
Shantanuo

1
Вы используете Linux, MacOSX, FreeBSD и т. Д.? Вывод 'ifconfig' различен для этих разных ОС, а команда 'ip' не существует в MacOSX. Вы ищете IP своего компьютера (вам понадобится сценарий оболочки для синтаксического анализа ifconfig или что-то в этом роде) или маршрутизатор (веб-сайты ниже могут работать)?
Стефан Ласевский

Ответы:


49

curl ifconfig.me

curl ifconfig.me/ip (только для ip)

curl ifconfig.me/all (для получения дополнительной информации требуется время)

Для получения дополнительной команды посетите: http://ifconfig.me/#cli_wrap


1
А как насчет адресов IPv6?
Matt3o12

Эта ссылка мертва. Вы можете использовать это вместо:curl http://checkip.amazonaws.com/
Farhan.K

@ Farhan.K, пожалуйста, оставьте это как ответ, так как это, вероятно, лучший ответ. Если вы этого не сделаете, я упомяну ваше имя и
предложу

@Aliostad не стесняйтесь отправлять это :)
Farhan.K

@ Farhan.K Argh, защищено: /
Aliostad

26

Вы можете запросить myip.opendns.com. из OpenDNS. dig @208.67.222.220 myip.opendns.com


8
Это просто круто. Для любой более легкой для запоминания версии вы можете вставить dig @resolver1.opendns.com myip.opendns.com. Или на Windows: nslookup myip.opendns.com resolver1.opendns.com.
Майкл Кропат

2
Что сработало для меня лучше всего: dig @208.67.222.220 myip.opendns.com +shortчтобы получить напрямую ip без необходимости проходить через весь ответ.
Кристофер Чич

18

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 один день, если правильно включен гуглом)).

Обратите внимание, что 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

2
@ Matt3o12 <Я нашел OpenDNS: dig +short AAAA myip.opendns.com @2620:0:ccc::2.
Буф

В настоящее время метод получения записей TXT от Google поддерживает как IPv4, так и IPv6, поэтому вам следует указать -4или, -6если вам нужна конкретная версия IP.
Мартин

12

Очень простой ответ, если у вас есть доступ в интернет:

curl icanhazip.com

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

Более надежный способ - выбрать известный, заслуживающий доверия DNS-сервер (в идеале работающий с DNSSEC) и запросить у него имя хоста коробки, при условии, что ваш DNS-сервер содержит такие записи;

dig @trustworthysource.com +short `hostname`

8

Я написал простой и быстрый веб-сервис для этого.

curl ident.me

Вы можете запросить ваш IPv4:

curl v4.ident.me

Или IPv6:

curl v6.ident.me

И API документирован на http://api.ident.me/


7

Один из способов: http://www.whatismyip.com/


1
Второй путь: ipchicken.com
Бобби

Или, если вы хотите XML API, ip-address.domaintools.com/myip.xml . Я видел один, который возвращает простой текст.
ceejayoz

7
Четвертый путь: moanmyip.com
MikeyB

1
Следуйте правилам, иначе вы ничего не получите. whatismyip.com/faq/automation.asp
Ladadadada

5

Если

  1. у вас есть только один публичный IP-адрес и
  2. вы напрямую подключены к интернету (нет NAT / прокси / VPN и т. д.)

затем вы можете просто проанализировать вывод ifconfig для IP-адресов интерфейсов (часть "inet addr:"), чтобы получить список IP-адресов всех ваших интерфейсов. Один IP-адрес, который не входит в закрытый диапазон (см. Http://en.wikipedia.org/wiki/IP_address#IPv4_private_addresses ), является вашим общедоступным IP-адресом.

Этот же список можно получить через

ip addr show

который может быть легче разобрать.

Если у вас нет прямого подключения к Интернету (NAT и т. Д.), Невозможно найти ваш общедоступный IP-адрес без посторонней помощи (так как ваш компьютер его не знает). Тогда вам придется сделать это, как в других ответах.


4

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


stun.l.google.com быстрее: D
Zibri

3

Одним из способов является, вы можете сделать запрос на странице по адресу

http://www.biranchi.com/ip.php

возвращает IP-адрес вашей системы


Он обслуживает простой текст с типом text / html ...
bortzmeyer

разве он не отображает ваш IP в вашем браузере?

2
Но с неправильным типом.
bortzmeyer

@bortzmeyer Э-э, что такое "правильный тип"? text/htmlхорошо для того, что возвращает этот псевдо-API - это, конечно, не XML или JSON. text/plainможет быть, но это полностью пригодно для использования text/html.
ceejayoz

3
+1 за страницу, которая не нуждается в просмотре. Такжеwget -q -O - http://wgetip.com/
xofer

3

Google теперь отображает ваш общедоступный IP-адрес: http://www.google.com/search?q=ip.


Это не работает для меня, ни в браузере, ни через curl.
Ладададада

Это странно. Мой говорит: «Ваш публичный IP-адрес - XX.XX.XXX.XX - Узнайте больше» вверху перед первым серпом.
Джейк Уилсон

Работал на моем 3G-соединении. Узнайте больше очков здесь .
Ладададада

Google по какой-то странной причине показывает только ваш IP-адрес в зависимости от того, какая User-Agentстрока указана на странице. С Firefox это работает; но SeaMonkey с отключенной строкой «Firefox» (через «general.useragent.compatMode.firefox», установленной в «false»), неожиданно этого не делает. Понятия не имею, почему Google явно разрешает подобные вещи только для Firefox, а не для любого Gecko, поскольку существует множество других настольных браузеров на базе Gecko, которые в равной степени совместимы, включая SeaMonkey.
CNST

curl -qs " google.com/search?q=blowme"|tr " () "" \ n "| grep Client | cut -d": "-f 2 | tr -d" "
Zibri

3

Хорошо ... Я знаю, что это ПУТЬ после факта и, вероятно, даже не стоит публиковать, но вот мое рабочее решение.

#!/bin/sh

IP="$(ifconfig | egrep 'inet ' | sed -e 's/inet //' -e 's/addr://' -e 's/ Bcast.*//' -e 's/127.*//')"
echo $IP

Красиво и просто.


2
Это возвращает внутренний IP-адрес, который не был запрошен. Но, для вашей информации, вы также можете сделать это с помощью команды hostname -I(заглавная «i»).
Redsandro

3

Самый простой способ - использовать http://ifconfig.me/ , как предлагается.

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

Для IP:

curl ifconfig.me
или
curl ifconfig.me/ip

Для публичного имени хоста:

curl ifconfig.me/host

Для всей информации в файле XML:

curl ifconfig.me/all.xml

и т.д ... просто проверьте http://ifconfig.me


2

Я делаю это много и со многих устройств, поэтому я сделал свои собственные две службы на сервере:

  1. 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
    
  2. быстрый взлом с пользовательским сервером 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 вы появляетесь.

Это не требует никакого стороннего обслуживания.


2

Чтобы не полагаться на внешние источники, я использую функцию 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.




1

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

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

Для автоматического способа вы можете попробовать:

wget -q -O - http://www.ipaddressworld.com | grep '[0-9]\{1,3\}\.[0-9]\{1,3\}'\. 

которая выдаст вам строку, содержащую IP-адрес в ответе http, а затем проанализирует его с помощью sed, awk и т. д.


0

вы можете использовать только оболочку для проверки вашего внешнего 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&nbsp;}"
            line=${line%%</p>*}
            echo "Your ip is: $line"
            exec >&5-
            exit
            ;;            
    esac
done <&5

выход


0
lynx --dump http://www.whatismyip.com/ | grep -o '[0-9]. * \. [0-9]. * \. [0-9]. * \. [0-9]. *'
-m1 

0

Я делаю это. Это просто дает мне IP без какого-либо участия третьих лиц ..

ip addr show | grep eth0 | grep inet | tr -s "" | cut -f3 -d "" | cut -f1 -d "/"


3
Он хочет, чтобы его публичный IP-адрес. Не местный.
Джейк Уилсон


0

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

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

2) Установите инструмент динамического обновления службы (сообщает об изменениях IP в службу).

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

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

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


0

На 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"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.