Пошук публічної 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, захищений: /
Аліостад

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 один день, якщо 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

2
@ Matt3o12 <Я знайшов OpenDNS: dig +short AAAA myip.opendns.com @2620:0:ccc::2.
bufh

На сьогодні метод отримання записів TXT від Google підтримує IPv4 та IPv6, тому вам слід вказати -4або -6вам потрібна конкретна версія IP.
Мартін

12

Дуже простий доступ, якщо у вас є доступ до Інтернету, це:

curl icanhazip.com

Майте на увазі, довіряти стороннім джерелам свого IP може бути проблематично, особливо якщо те, що ви робите з цими даними, має особливе значення.

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

dig @trustworthysource.com +short `hostname`


7

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


1
другий спосіб: ipchicken.com
бобі

Або, якщо ви хочете API XML, ip-address.domaintools.com/myip.xml . Я побачив там, який повертає звичайний текст.
ceejayoz

7
Четвертий шлях: moanmyip.com
MikeyB

1
Дотримуйтесь правил, інакше ви нічого не отримаєте. whatismyip.com/faq/automation.asp
Ladadadada

5

Якщо

  1. у вас є лише одна загальнодоступна IP-адреса та
  2. ви безпосередньо підключені до Інтернету (без NAT / proxy / 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, ви можете просто встановити пакет "оглушення", ввівши:

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 "stunserver.org" і отримує відповідь з вашим загальнодоступним IP-адресою, решта команди - лише відфільтрувати IP з виводу.


stun.l.google.com швидше: D
Zibri

3

Один із способів - ви можете зробити запит на сторінку за адресою

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

він повертає IP-адресу вашої системи


Він подає звичайний текст із типом тексту / 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.
Ladadadada

Це дивно. Шахта говорить: "Ваша загальнодоступна IP-адреса - XX.XX.XXX.XX - Дізнайтеся більше" вгорі перед першою серпом.
Джейк Вілсон

Працював над моїм 3G-з'єднанням. Дізнайтеся більше балів тут .
Ladadadada

Google з якихось дивних причин показує лише вашу IP-адресу на основі того, який User-Agentрядок надається на сторінку. З Firefox це працює; але SeaMonkey з відключеною рядком "Firefox" (через "general.useragent.compatMode.firefox" встановлено на помилку), раптом це не відбувається. Не майте абсолютно ніякого поняття, чому 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(з великої літери 'я').
Редсандро

3

Найпростіший спосіб - використовувати http://ifconfig.me/ , як пропонується.

На цій сторінці ви дізнаєтесь, яку команду використовувати для отримання інформації, яку ви хочете отримати.

Для IP:

завиток ifconfig.me
або
завиток ifconfig.me/ip

Для загального імені хоста:

завиток ifconfig.me/host

Для всієї інформації у файлі XML:

завиток 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
    

    З сіткою:

    $ 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
    }
    

    а потім telnet до нього:

    $ 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]. * "
-м1 

0

Я роблю це. Це просто дає мені IP без будь-якої сторонньої участі ..

ip addr show | grep eth0 | grep inet | tr -s "" | вирізати -f3 -d "" | вирізати -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

У ОС X ось два простих рішення для отримання приватного та загальнодоступного IP-адреси (з бонус-кодом, якщо ви використовуєте LaunchBar).

Приватний IP

$ ipconfig getifaddr $1
# $1=en0 || en1 || en*

Сценарій LaunchBar

#!/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

#!/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.