Tìm địa chỉ IP công cộng trong tập lệnh shell


39

Tôi có thể tìm địa chỉ IP của mình bằng lệnh ifconfig hoặc hostname -i.

Nhưng làm cách nào để tìm IP công cộng của tôi?

(Tôi có một IP công cộng tĩnh nhưng tôi muốn tìm ra nó bằng lệnh unix)


bạn đang cố gắng làm điều này một cách lập trình?
Andrew Keith

có trong kịch bản shell
shantanuo

1
Bạn đang sử dụng Linux, MacOSX, FreeBSD, v.v? Đầu ra của 'ifconfig' là khác nhau đối với các HĐH khác nhau này và lệnh 'ip' không tồn tại trên MacOSX. Bạn đang tìm IP của máy tính của bạn (Bạn sẽ cần một tập lệnh shell để phân tích ifconfig, hoặc một cái gì đó) hoặc bộ định tuyến của bạn (Các trang web dưới đây có thể hoạt động)?
Stefan Lasiewski

Câu trả lời:


49

curl ifconfig.me

curl ifconfig.me/ip (chỉ cho ip)

curl ifconfig.me/all (để biết thêm thông tin, cần có thời gian)

Để biết thêm các lệnh truy cập: http://ifconfig.me/#cli_wrap


1
Địa chỉ IPv6 thì sao?
Matt3o12

Liên kết đó đã chết. Bạn có thể sử dụng cái này thay thế:curl http://checkip.amazonaws.com/
Farhan.K

@ Farhan.K xin vui lòng gửi đây là một câu trả lời vì nó có thể là câu trả lời tốt nhất. Nếu bạn không, tôi sẽ và đề cập đến tên của bạn gợi ý nó
Aliostad

@Aliostad cứ thoải mái đăng nó :)
Farhan.K

@ Farhan.K argh, được bảo vệ: /
Aliostad

26

Bạn có thể yêu cầu myip.opendns.com. từ OpenDNS. dig @208.67.222.220 myip.opendns.com


8
Điều đó thật tuyệt. Đối với bất kỳ phiên bản dễ nhớ hơn, bạn có thể đặt vào dig @resolver1.opendns.com myip.opendns.com. Hoặc trên Windows : nslookup myip.opendns.com resolver1.opendns.com.
Michael Kropat

2
Điều gì làm việc tốt nhất cho tôi: dig @208.67.222.220 myip.opendns.com +shortđể có được trực tiếp ip mà không cần phải đi qua toàn bộ câu trả lời.
Christopher Chiche

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


Lưu ý rằng hiện tại chỉ hoạt động cho IPv4 (hiện tại không có bộ phân giải nào có vẻ như có IPv6, nhưng nếu bạn bỏ qua -4và rõ ràng -t a, thì bạn có nguy cơ bị hỏng trong tương lai (ngoại trừ Google txt, có thể thực sự hoạt động cho IPv6 một ngày, nếu được Google kích hoạt đúng cách)).

Lưu ý rằng myip.opendns.comchỉ có thể giải quyết thông qua resolver1.opendns.com, chứ không phải với auth1.opendns.com- vì vậy, dường như họ đang thực hiện một số vụ chiếm quyền điều khiển DNS và người đứng giữa tên miền của chính họ! Vì vậy, bạn không thể sử dụng nó để tìm IP của trình phân giải ngẫu nhiên, vì resolver1.opendns.comkhông có thẩm quyền cho myip.opendns.com.

Lưu ý rằng có o-o.myaddr.l.google.comvẻ như cách tiếp cận linh hoạt nhất và trong tương lai; thậm chí còn tốt để kiểm tra xem trình phân giải DNS của bạn có hỗ trợ tiện ích mở rộng EDNS0 thử nghiệm cho mạng con máy khách hay không (mà rất ít trình phân giải có hỗ trợ):

% 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 <Tôi tìm thấy OpenDNS : dig +short AAAA myip.opendns.com @2620:0:ccc::2.
bufh

Ngày nay, phương pháp nhận bản ghi TXT từ Google hỗ trợ cả IPv4 và IPv6, do đó bạn nên chỉ định -4hoặc -6nếu bạn cần một phiên bản IP cụ thể.
Martin

12

Một anwser rất đơn giản nếu bạn có quyền truy cập internet là:

curl icanhazip.com

Hãy nhớ rằng, việc tin tưởng các nguồn của bên thứ ba cho IP của bạn có thể có vấn đề đặc biệt là nếu những gì bạn làm với dữ liệu đó có ý nghĩa đặc biệt.

Một cách đáng tin cậy hơn là chọn một máy chủ DNS đáng tin cậy (đáng tin cậy đang chạy DNSSEC) và truy vấn tên máy chủ của hộp với nó, cung cấp máy chủ DNS của bạn chứa các mục đó;

dig @trustworthysource.com +short `hostname`

8

Tôi đã viết một dịch vụ web đơn giản và nhanh chóng cho việc này.

curl ident.me

Bạn có thể yêu cầu IPv4 của bạn:

curl v4.ident.me

Hoặc IPv6:

curl v6.ident.me

Và API được ghi lại trên http://api.ident.me/



5

Nếu

  1. bạn chỉ có một địa chỉ IP công cộng và
  2. bạn được kết nối trực tiếp với internet (không có NAT / proxy / VPN, v.v.)

sau đó bạn chỉ có thể phân tích đầu ra từ ifconfig cho các địa chỉ IP của các giao diện (phần "inet addr:") để lấy danh sách địa chỉ IP của tất cả các giao diện của bạn. Một địa chỉ IP không nằm trong phạm vi riêng tư (xem http://en.wikipedia.org/wiki/IP_address#IPv4_private_addresses ) là địa chỉ IP công cộng của bạn.

Danh sách tương tự cũng có thể có được thông qua

ip addr show

mà có thể dễ dàng hơn để phân tích.

Nếu bạn không có kết nối internet trực tiếp (NAT, v.v.), không có cách nào để tìm địa chỉ IP công cộng của bạn mà không có sự trợ giúp bên ngoài (vì máy tính của bạn không biết điều đó). Sau đó, bạn sẽ phải làm điều đó như trong các câu trả lời khác.


4

Tôi đã thực hiện một cách tiếp cận khác bằng cách sử dụng giao thức STUN được thiết kế cho NAT Traversal. Nếu bạn sử dụng Ubuntu, bạn có thể chỉ cần cài đặt gói "choáng" bằng cách gõ:

sudo apt-get install stun

Gói cài đặt một máy chủ STUN mà bạn có thể không cần, nhưng nó cũng đi kèm với một máy khách thử nghiệm STUN mà tôi đã sử dụng để giải quyết vấn đề này. Bây giờ bạn có thể truy xuất IP công cộng của mình bằng một lệnh (không đơn giản như vậy):

stun -v stunserver.org 2>&1 1>/dev/null | grep MappedAddress | sed -e 's/.*MappedAddress = //' -e 's/:.*//' | uniq

Bây giờ, những gì nó làm là: stun liên lạc với máy chủ STUN công khai "stunerver.org" và nhận được câu trả lời với IP công cộng của bạn, phần còn lại của lệnh chỉ là để lọc IP từ đầu ra.


stun.l.google.com nhanh hơn: D
Zibri

3

Một cách là, bạn có thể yêu cầu trang tại

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

nó trả về địa chỉ IP của hệ thống của bạn


Nó phục vụ văn bản đơn giản với một loại văn bản / html ...
bortzmeyer

Nó không hiển thị IP của bạn trong trình duyệt của bạn?

2
Nhưng với loại sai.
bortzmeyer

@bortzmeyer Uh, "đúng loại" là gì? text/htmlphù hợp với những gì mà API giả trả về - chắc chắn không phải là XML hay JSON. text/plaincó thể, nhưng nó hoàn toàn có thể sử dụng như text/html.
ceejayoz

3
+1 cho một trang không cần grepping. Ngoài rawget -q -O - http://wgetip.com/
xofer

3

Google hiện hiển thị địa chỉ IP công cộng của bạn: http://www.google.com/search?q=ip


Điều đó không làm việc cho tôi, trong trình duyệt hoặc qua curl.
Ladadadada

Điều đó thật lạ. Mine nói "Địa chỉ IP công cộng của bạn là XX.XX.XXX.XX - Tìm hiểu thêm" ở đầu trước serp đầu tiên.
Jake Wilson

Hoạt động trên kết nối 3G của tôi. Tìm hiểu thêm điểm ở đây .
Ladadadada

Google vì một số lý do lạ chỉ hiển thị địa chỉ IP của bạn dựa trên User-Agentchuỗi nào được cung cấp cho trang. Với Firefox, nó hoạt động; nhưng SeaMonkey với chuỗi "Firefox" bị vô hiệu hóa (thông qua "general.useragent.compatMode.firefox" được đặt thành false), nó đột nhiên không hoạt động. Hoàn toàn không có lý do tại sao Google kích hoạt rõ ràng những thứ như thế này chỉ dành cho Firefox thay vì bất kỳ Gecko nào, vì có nhiều trình duyệt máy tính để bàn khác dựa trên Gecko tương thích như nhau, bao gồm cả SeaMonkey.
cnst

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

3

Được rồi ... Tôi biết rằng đây là CÁCH sau khi thực tế và có lẽ thậm chí không đáng để đăng, nhưng đây là giải pháp làm việc của tôi.

#!/bin/sh

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

Đẹp và đơn giản.


2
Điều này trả về địa chỉ IP nội bộ không được yêu cầu. Nhưng, đối với thông tin của bạn, bạn cũng có thể thực hiện việc này bằng lệnh hostname -I(viết hoa 'i').
Redsandro

3

Cách đơn giản nhất là sử dụng http://ifconfig.me/ , như được đề xuất.

Trên trang này, bạn sẽ biết nên sử dụng lệnh nào cho thông tin bạn muốn lấy.

Đối với IP:

cuộn tròn ifconfig.me
hoặc là
cuộn tròn ifconfig.me/ip

Đối với tên máy chủ công cộng:

cuộn tròn ifconfig.me/host

Đối với tất cả các thông tin trong một tệp XML:

curl ifconfig.me/all.xml

v.v ... chỉ cần xem http://ifconfig.me


2

Tôi đang làm điều này rất nhiều và từ rất nhiều thiết bị, vì vậy tôi đã tự tạo hai dịch vụ của mình trên một máy chủ:

  1. Tệp php ở thư mục gốc của máy chủ web:

    user@host:~$ cat index.php`
    <?php echo $_SERVER['REMOTE_ADDR']; echo "\n" ?>
    

    Cách sử dụng trên vỏ:

    $ curl -4 mydomain.com
    79.22.192.12
    

    cũng làm việc với ipv6:

    $ curl mydomain.com
    2a01:e34:ee7d:180::3
    

    Với netcat:

    $ echo "GET /" | nc myserver.com 80
    2a01:e34:ee7d:180::3
    

    Trên bộ định tuyến của Cisco:

    router#more http://myserver.com/index.php
    79.22.192.12
    
  2. hack nhanh với một máy chủ telnet tùy chỉnh: 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
    }
    

    và sau đó telnet đến nó:

    $ nc -4 myserver.com 23
    REMOTE_HOST=::ffff:79.22.192.12
    
    $ nc myserver.com 23
    REMOTE_HOST=2a01:e34:ee7d:180::3
    

    hoạt động tương tự với bộ định tuyến:

    router#telnet myserver.com
    79.22.192.12
    

Bằng cách này, bạn có thể làm cho nó hoạt động trên mạng nội bộ của mình, nếu một số nat hoặc proxy có liên quan đến giao tiếp và bạn muốn biết IP nào bạn xuất hiện.

Nó không yêu cầu bất kỳ dịch vụ của bên thứ ba.


2

Để tránh phụ thuộc vào các nguồn bên ngoài, tôi sử dụng mong đợi, để telnet vào bộ định tuyến của mình và lấy địa chỉ IP của giao diện công cộng. Đây là một ví dụ mong đợi kịch bản:

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

Sau đó tôi thực thi đoạn script trên như thế này để lấy ip công khai:

./telnet2router.exp <router-ip> <username> <password> | grep "inet addr" | cut -d : -f 2 | cut -d " " -f 1

Tất nhiên, điều này dựa trên giả định rằng tôi có quyền truy cập quản trị viên vào bộ định tuyến và bộ định tuyến dựa trên linux, với lệnh ifconfig có sẵn.




1

Nếu điều bạn muốn là tìm địa chỉ IP bên ngoài trên bộ định tuyến của mình, bạn có thể hỏi chính bộ định tuyến đó cho địa chỉ wan của nó hoặc nhờ ai đó bên ngoài lấy nó cho bạn ..

đối với cách thủ công, bạn có thể duyệt bất kỳ trang web nào ở trên sẽ trả về ip của yêu cầu không liên quan.

Đối với một cách tự động, bạn có thể thử:

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

sẽ cung cấp cho bạn dòng chứa địa chỉ IP trên phản hồi http, sau đó phân tích nó bằng sed, awk, v.v.


0

bạn chỉ có thể sử dụng shell để kiểm tra ip bên ngoài của mình, cũng sử dụng các nhà cung cấp bên ngoài

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

đầu ra


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

0

Tôi làm việc này. Nó chỉ cung cấp cho tôi IP mà không có sự tham gia của bên thứ ba ..

ip addr hiển thị | grep eth0 | grep inet | tr -s "" | cắt -f3 -d "" | cắt -f1 -d "/"


3
Anh ta muốn địa chỉ IP công cộng của mình. Không phải địa phương.
Jake Wilson

0
wget -q -O - checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//'

0

Đây là một giải pháp thay thế khác phụ thuộc vào các máy chủ mà doanh nghiệp của họ giải quyết xung quanh việc quản lý IP động thay vì các trang web "dịch vụ công cộng" có thể biến mất hoặc thay đổi định dạng.

1) Đăng ký máy chủ của bạn tại một trong nhiều dịch vụ dns động miễn phí (ví dụ: no-ip.com) Điều này sẽ cung cấp cho bạn một mục nhập DNS như xxx.no-ip.org.

2) Cài đặt công cụ cập nhật động của dịch vụ (báo cáo thay đổi IP thành dịch vụ).

Để lấy địa chỉ IP trong tập lệnh, chỉ cần làm:

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

Tuyệt vời để sử dụng trong công việc định kỳ để kiểm tra xem IP động có thay đổi hay không và một số mục cấu hình cần được thay đổi.


0

Trên OS X, đây là hai giải pháp đơn giản để có cả IP riêng và IP công cộng (có mã thưởng nếu bạn sử dụng LaunchBar).

IP riêng

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

Tập lệnh 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 công cộng

$ 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

Tập lệnh 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"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.