Làm cách nào tôi có thể nhận địa chỉ IP bên ngoài của mình trong tập lệnh shell?


273

Tôi cần tìm địa chỉ IP bên ngoài của mình từ tập lệnh shell. Hiện tại tôi sử dụng chức năng này:

myip () { 
    lwp-request -o text checkip.dyndns.org | awk '{ print $NF }'
}

Nhưng nó phụ thuộc vào perl-libwww, perl-html-format, perl-html-treecài đặt. Những cách khác tôi có thể nhận được IP bên ngoài của tôi?


8
IP bên ngoài có nghĩa là gì? Hai câu trả lời cho đến nay sử dụng HTTP. Phản hồi có thể là IP của máy chủ proxy của ISP. (Đó có thể là những gì bạn muốn.)
billpg

@billpg: Ý tôi là IP của bộ định tuyến NAT
Eugene Yarmash

Sau đó, bạn sẽ cần một dịch vụ web-is-my-IP sử dụng HTTPS. Than ôi, tôi không biết gì cả.
billpg

1
@billpg ipcheckit.com
Gilles

checkip.amazonaws.com sử dụng điều này từ nhà cung cấp nổi tiếng
arulraj.net

Câu trả lời:


441

Tôi khuyên bạn nên lấy nó trực tiếp từ máy chủ DNS.

Hầu hết các câu trả lời khác dưới đây đều liên quan đến việc chuyển qua HTTP đến một máy chủ từ xa. Một số trong số họ yêu cầu phân tích cú pháp đầu ra hoặc dựa vào tiêu đề Tác nhân người dùng để làm cho máy chủ phản hồi bằng văn bản thuần túy. Những thay đổi khá thường xuyên (đi xuống, thay đổi tên của họ, đưa lên quảng cáo, có thể thay đổi định dạng đầu ra, v.v.).

  1. Giao thức phản hồi DNS được chuẩn hóa (định dạng sẽ vẫn tương thích).
  2. Trong lịch sử, các dịch vụ DNS ( OpenDNS , Google Public DNS , ..) có xu hướng tồn tại lâu hơn nhiều và ổn định hơn, có khả năng mở rộng hơn và thường được chăm sóc nhiều hơn bất kỳ dịch vụ HTTP mới nào hiện nay.
  3. Phương pháp này vốn đã nhanh hơn (chỉ trong vài mili giây!).

Sử dụng digvới OpenDNS làm trình phân giải:

dig @resolver1.opendns.com ANY myip.opendns.com +short

Có lẽ bí danh nó trong của bạn bashrcđể nó dễ nhớ

alias wanip='dig @resolver1.opendns.com ANY myip.opendns.com +short'

Trả lời với một địa chỉ IP đơn giản:

$ wanip
80.100.192.168 # or, 2606:4700:4700::1111

Cú pháp

(Viết tắt từ https://ss64.com/bash/dig.html ) :

usage:  dig [@global-dnsserver] [q-type] <hostname> <d-opt> [q-opt]

    q-type   one of (A, ANY, AAAA, TXT, MX, ...). Default: A.

    d-opt    ...
             +[no]short          (Display nothing except short form of answer)
             ...

    q-opt    one of:
             -4                  (use IPv4 query transport only)
             -6                  (use IPv6 query transport only)
             ...

Kiểu ANYtruy vấn trả về AAAA hoặc bản ghi A. Để đặc biệt thích kết nối IPv4 hoặc IPv6, hãy sử dụng -4hoặc -6tùy chọn tương ứng.

Để yêu cầu phản hồi là địa chỉ IPv4, thay thế BẤT K with bằng A; đối với IPv6, thay thế nó bằng AAAA.Lưu ý rằng nó chỉ có thể trả về địa chỉ được sử dụng cho kết nối. Ví dụ: khi kết nối qua IPv6, nó không thể trả về địa chỉ A.

Máy chủ và ví dụ thay thế

Ngoài OpenDNS, còn có các dịch vụ DNS tương tự được cung cấp bởi Akamai và Google:

$ dig @ns1-1.akamaitech.net ANY whoami.akamai.net +short
80.100.192.168

$ dig @ns1.google.com TXT o-o.myaddr.l.google.com +short
"80.100.192.168"

Ví dụ bí danh yêu cầu cụ thể một địa chỉ IPv4:

alias wanip4='dig @resolver1.opendns.com A myip.opendns.com +short -4'

$ wanip4
80.100.192.168

Và đối với IPv6:

alias wanip6='dig @resolver1.opendns.com AAAA myip.opendns.com +short -6'

$ wanip6
2606:4700:4700::1111

Xử lý sự cố

Nếu một số lý do không hoạt động, có thể có vấn đề với nhà cung cấp ngược dòng, công cụ dòng lệnh hoặc một cái gì đó khác. Để giúp hiểu lý do tại sao nó không hoạt động, hãy chạy lệnh mà không có +shorttùy chọn tiết lộ chi tiết của truy vấn DNS. Ví dụ:

$ dig @resolver1.opendns.com ANY myip.opendns.com

;; Got answer: ->>HEADER<<- opcode: QUERY, status: NOERROR

;; QUESTION SECTION:
;myip.opendns.com.      IN  ANY

;; ANSWER SECTION:
myip.opendns.com.   0   IN  AAAA    2606:4700:4700::1111

;; Query time: 4 msec
;; WHEN: Fri Apr 11 00:00:01 GMT 2011

18
bạn nói đúng là quá nhanh ..
Rahul Patil

4
@Krinkle đó là một câu trả lời tuyệt vời. Có tương đương với myip.opendns.comtrong DNS công cộng của Google không?
Kannan Mohan

12
Tôi thấy điều này nhanh hơn ~ 19 lần curl http://canhazip.com. Xem Askubfox.com/a/427092/2273
Adam Monsen

3
Yêu cách tiếp cận sạch sẽ / không phụ thuộc này tốt hơn nhiều so với tất cả các đề xuất khác, trừ khi bạn bị ràng buộc với cổng 80
binaryanomaly 14/03/2015

5
Xin lưu ý rằng trong một số trường hợp, các bộ định tuyến cung cấp NAT cũng sẽ dịch các phản hồi DNS (bạn có thể xem wiki.nil.com/Network_address_translation_of_DNS_responses ); trong trường hợp này, bạn nên dự phòng một số câu trả lời đề xuất cách tiếp cận khác ngoài DNS.
Razvan Stefanescu

146

Chú ý: Đây là khoảng bên ngoài địa chỉ IP (một trong đó các máy chủ trên Internet thấy khi bạn kết nối với họ) - nếu bạn muốn nội địa chỉ IP (một trong đó máy tính của bạn đang sử dụng cho các kết nối, có thể khác nhau) thấy này trả lời .

TL; DR - Phương pháp nhanh nhất năm 2015

Phương pháp nhanh nhất sử dụng DNS:

dig +short myip.opendns.com @resolver1.opendns.com

hoặc sử dụng bên ngoài :

externalip dns

Sử dụng HTTP nhanh nhất:

curl -s http://whatismyip.akamai.com/

hoặc sử dụng bên ngoài:

externalip http

Sử dụng HTTPS nhanh nhất với chứng chỉ hợp lệ:

curl -s https://4.ifcfg.me/

hoặc sử dụng bên ngoài:

externalip https

Sử dụng telnet:

Với nclệnh:

nc 4.ifcfg.me 23 | grep IPv4 | cut -d' ' -f4

hoặc sử dụng bên ngoài:

externalip telnet

Với telnetlệnh:

telnet 4.ifcfg.me 2>&1 | grep IPv4 | cut -d' ' -f4

Sử dụng FTP:

echo close | ftp 4.ifcfg.me | awk '{print $4; exit}'

hoặc sử dụng bên ngoài:

externalip ftp

Tất cả những điều trên có thể được chạy bằng cách sử dụng tập lệnh bên ngoài của tôi như:

externalip dns
externalip http
externalip https
externalip telnet
externalip ftp

Bây giờ là một câu chuyện dài ...

Có rất nhiều tùy chọn của các máy chủ khác nhau cung cấp IP bên ngoài, đặc biệt là thông qua HTTP được đăng ở đây hoặc ở nơi khác.

Tôi đã làm một điểm chuẩn để xem liệu có ai trong số họ tốt hơn những người khác không và tôi rất ngạc nhiên với kết quả. Ví dụ: một trong những ifconfig.me được khuyên dùng rộng rãi nhất hầu như luôn là chậm nhất đối với tôi, đôi khi mất nhiều giây để phản hồi. Nhiều người không làm việc trên HTTPS hoặc làm việc nhưng có chứng chỉ không hợp lệ. Một số có thời gian đáp ứng rất không nhất quán.

Điểm chuẩn

HTTP và HTTPS

Đây là nguồn của tập lệnh ngoài chuẩn của tôi mà tôi đã sử dụng:

Bạn có thể tự chạy nó để xem những dịch vụ nào được đề cập ở đây đáng để sử dụng:

wget https://raw.githubusercontent.com/rsp/scripts/master/externalip-benchmark
chmod a+x externalip-benchmark
./externalip-benchmark

Kết quả của tôi mà tôi nhận được vào 2015-04-03 từ Warsaw - địa chỉ đã được thay đổi để bảo vệ người vô tội:

Thời gian phản hồi http tốt nhất:

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'

Thời gian phản hồi https tốt nhất:

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=''

(Lưu ý: có một số phản hồi nhanh với nội dung trống - những nội dung không hợp lệ.)

Thời gian ping trung bình tốt nhất:

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/

Đây là kết quả mà tôi nhận được vào 2015-04-03 từ Amsterdam:

Thời gian phản hồi http tốt nhất:

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.142s 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'

Thời gian phản hồi https tốt nhất:

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=''

Thời gian ping trung bình tốt nhất:

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/

(Các ping 999999 có nghĩa là mất gói 100%.)

DNS

Để so sánh ở đây là thời gian mà các phương pháp khác thực hiện - được thử nghiệm vào 2015-06-16 từ Warsaw và Amsterdam.

Sử dụng:

time dig +short myip.opendns.com @resolver1.opendns.com

thường mất (thời gian đồng hồ treo tường thực sự) về:

  • 0,035s từ Warsaw
  • 0,015s từ Amsterdam

Thực tế, có bốn bộ giải có thể được sử dụng theo cách này:

  • độ phân giải1.opendns.com
  • độ phân giải2.opendns.com
  • độ phân giải3.opendns.com
  • độ phân giải4.opendns.com

Tất cả họ đều đưa ra thời gian phản hồi giống nhau ở Warsaw và Amsterdam nhưng điều này có thể không xảy ra ở các địa điểm khác.

Sử dụng 208.67.222.222 - IP của decver1.opendns.com thay vì tên miền của nó nhanh hơn:

  • 0,023s từ Warsaw
  • 0,009 từ Amsterdam

nhưng có thể không hoạt động trong tương lai nếu IP thay đổi (mặc dù có thể không có khả năng cho trình phân giải DNS nổi tiếng - có lẽ tôi nên sử dụng IP trong tập lệnh bên ngoài của mình - vui lòng nhận xét).

Telnet

Telnet có nchoặc telnetlệnh (xem ở trên) thường mất:

  • 0.103s từ Warsaw
  • 0,035s từ Amsterdam

(Không có sự khác biệt đáng chú ý giữa nctelnetcác lệnh.)

FTP

  • 0.104s từ Warsaw
  • 0,036s từ Amsterdam

Tên miền

Tất cả các phương thức sẽ nhanh hơn (đặc biệt là khi chạy lần đầu tiên) khi địa chỉ IP sẽ được sử dụng thay vì tên miền của các dịch vụ đã cho (ngoại trừ HTTP có thể sử dụng máy chủ ảo dựa trên máy chủ và không hoạt động với IP trần - không được kiểm tra) nhưng sẽ ngừng hoạt động khi các dịch vụ thay đổi địa chỉ IP để có thể nhanh hơn nhưng ít chứng minh trong tương lai.

Bình luận

Nếu bạn thấy một số kết quả thú vị từ vị trí của bạn hoặc nếu bạn nghĩ rằng một số máy chủ khác nên được đề xuất thay vì những kết quả mà tôi đã chọn, vui lòng gửi bình luận. Nếu có bất kỳ dịch vụ quan trọng nào bị thiếu, vui lòng bình luận hoặc đăng một vấn đề trên GitHub. Tôi muốn giữ cho bài đăng này được cập nhật với sự lựa chọn hiện tại của các dịch vụ hoạt động tốt nhất.


2
Bạn đã điểm chuẩn myip.opendns.comphương pháp DNS như trong câu trả lời của Krinkle chưa? Hiện tại có vẻ như nó là người chiến thắng theo mặc định do không biết về bất kỳ nhà cung cấp nào khác cho phương pháp này, nhưng vẫn rất hữu ích khi so sánh với các phương pháp khác.
James Haigh

@JamesHaigh Cảm ơn lời đề nghị. Tôi đã thêm DNS và các phương thức khác (telnet, ftp) vào câu trả lời. Phương pháp nhanh nhất dường như là DNS sử dụng trực tiếp địa chỉ IP (thay vì tên miền) của trình phân giải.
rsp

Bạn cũng nên thêm / kiểm tra canhazip.com / canhazip.com (HTTP và HTTPS).
xxdesmus

Bạn có thể thêm myip.addr.space vào danh sách của bạn. Tôi tự xây dựng nó vì tôi không hài lòng với bất kỳ ai khác mà tôi đã thấy vào thời điểm đó.
Michael Hampton

Đôi khi tôi nhận được các kết quả khác nhau bằng cách sử dụng dig +short myip.opendns.com @resolver1.opendns.com(36.86.63.180), dig -4 @ns1-1.akamaitech.net -t a whoami.akamai.net +short(118.98.115.34) và curl http://canhazip.com(36.71.64.71). Làm thế nào tôi có thể quyết định cái nào là đúng?
Sutandiono

80
 curl -s http://whatismijnip.nl |cut -d " " -f 5

Trang web thay thế với một người Hà Lan làm việc một.


3
+1 Tôi biết về whatismyip.com, nhưng không biết whatismyip.org, điều đó thật tuyệt vời.
Julian

Không bao giờ biết về điều đó! Trang web tuyệt vời!
bbosak

2
@MaciekSawicki -sTùy chọn này có thực sự cần thiết trong trường hợp này không? Tôi đã thử với / không có nó trong fedora 15 - bash 4.2.10 (1) và nó hoạt động theo cả hai cách.
ztank1013

4
Dường như không hoạt động nữa thông qua CLI, nhưng đi đến trang web từ trình duyệt web hoạt động. Tôi đang sử dụng openSUSE 12.1 x64.
SaultDon

5
whatismyip.comđã loại bỏ dịch vụ miễn phí để kiểm tra IP bên ngoài. Vì vậy, tôi sợ điều này không còn đúng nữa. icanhazip.comvẫn hoạt động.
daSong


18

Bạn có thể sử dụng ifconfig.me thay thế cho whatismyip.org.

curl -s http://ifconfig.me

Ngoài ra ifconfig.me có một số chức năng bổ sung. Để tìm hiểu những thông tin khác bạn có thể nhận được truy cập trang web.


5
cực kỳ chậm . Tôi thường nhận được thời gian phản hồi hơn 30 giây, đôi khi thậm chí hơn một phút! Đôi khi đó là nửa giây (vẫn còn rất nhiều), và sau đó là 15 giây hoặc lâu hơn. Điều này được thử nghiệm từ các địa điểm khác nhau. Xem câu trả lời của tôi để biết thêm thông tin và điểm chuẩn.
rsp

15
wget -O - -q http://whatismyip.org/

3
Tôi không thể có được IP của mình như thế này, chỉ cần cung cấp dưới dạng:<img src='ipimg.php'/>
Yuugian

Nó đã làm việc với một số phép thuật regex phong nha, nhưng nó không dễ dàng. Nếu bạn khăng khăng sử dụng dịch vụ này, hãy chắc chắn gói dòng đó thành một tập lệnh:$ curl -s http://whatismyip.org | grep -o '\([[:digit:]]\{1,3\}\.\)\{3\}[[:digit:]]\{1,3\}'
cú pháp

13

Amazon AWS

curl https://checkip.amazonaws.com

Đầu ra mẫu:

123.123.123.123

Tôi thích nó bởi vì:

  • nó chỉ trả về IP bản rõ, không có gì khác
  • đó là từ một nhà cung cấp nổi tiếng không có khả năng sớm ngoại tuyến bất cứ lúc nào

9

Tôi thích sử dụng curlmyip.com Nó đơn giản như:

curl curlmyip.com

Nó ngắn và đơn giản để nhớ.


Để sử dụng trong bashmục đích của ý định của OP, bạn không thể thực hiện mà không có -stùy chọn được đề cập trong các câu trả lời khác.
Serge Stroobandt

3
@SergeStroobandt Có bạn có thể. Tất cả các -schuyển đổi làm là chạy nó trong chế độ im lặng, tức là. thông báo lỗi sẽ không được hiển thị. Vì vậy, đó là cách anh ấy muốn kịch bản của mình xử lý lỗi. Lệnh sẽ trả về một địa chỉ IP đáng tin cậy như sử dụng -s.
Garrett Fogerlie

1
Cho đến nay, trang web này là trang đáng tin cậy nhất trong nhiều bài kiểm tra.
Amos Shapira

9
curl ident.me

HOẶC LÀ

curl ifconfig.me

HOẶC LÀ

curl tnx.nl/ip

HOẶC LÀ

curl ipecho.net/plain

HOẶC LÀ

curl ip.appspot.com

HOẶC LÀ

curl whatismyip.akamai.com

HOẶC LÀ

curl icanhazip.com

HOẶC LÀ

curl wgetip.com

HOẶC LÀ

curl ip.tyk.nu

HOẶC LÀ

curl curlmyip.com

HOẶC LÀ

curl corz.org/ip

HOẶC LÀ

curl bot.whatismyipaddress.com

Tài liệu tham khảo


6
netcat icanhazip.com 80 <<< $'GET / HTTP/1.1\nHost: icanhazip.com\n\n' | tail -n1

Sản lượng trống ở đây, mặc dù trang web hoạt động. Bất cứ ý tưởng tại sao? Tôi đứng sau một proxy, nếu điều đó có liên quan, nhưng wget icanhazip.comhoạt động.
l0b0

@ l0b0 Hãy thử bỏ qua | tail -n1phần đó và xem những gì bạn nhận được từ proxy
Eugene Yarmash

Không có gì, chỉ cần thoát mã 1. Ditto cho netcat icanhazip.com 80. Có vẻ như nó bỏ qua $http_proxyvà bạn bè, vì chỉ định proxy và cổng -xchỉ dẫn đến quá trình treo.
l0b0

@ l0b0: netcat proxy 3128 <<<$'GET http://icanhazip.com/ HTTP/1.0\n\n' | tail -n 1đối với proxy HTTP cơ bản (giả sử nó đang chạy trên cổng 3128). Bạn rõ ràng sẽ lấy lại địa chỉ IP của proxy.
tripleee

1
HTTP 1.0 không có Host:tiêu đề yêu cầu - lưu trữ ảo dựa trên tên là một trong những cải tiến chính trong HTTP 1.1. Thay đổi yêu cầu chỉ định HTTP / 1.1 hoặc xóa tiêu đề Máy chủ (tôi khuyên dùng trước đây).
một CVn

4

Nếu sau khi đọc tất cả những gợi ý này mà bạn muốn đọc nhiều hơn nữa, thì đây là một kịch bản Bash được thiết kế quá mức.

Nó chứa một danh sách các máy chủ DNS và HTTP dường như hoạt động tốt kể từ tháng 2 năm 2017.

Nếu bạn có dig, trước tiên, nó sẽ thử DNS gần như là một thứ tự có độ lớn nhanh hơn các dịch vụ HTTP khác nhau.

Nó thoát ra ở lần trả lời đầu tiên.

Nếu bạn không có dighoặc nếu tất cả các máy chủ DNS không thành công, thì nó sẽ thử các dịch vụ HTTP cho đến khi nhận được phản hồi.

Các máy chủ được liệt kê theo thứ tự abc, nhưng được xáo trộn trước khi sử dụng để tránh luôn sử dụng cùng một máy chủ.

#!/bin/bash

## Get my external IP

timeout=2   # seconds to wait for a reply before trying next server
verbose=1   # prints which server was used to 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
)



# function to shuffle the global array "array"
shuffle() {
   local i tmp size max rand
   size=${#array[*]}
   max=$(( 32768 / size * size ))
   for ((i=size-1; i>0; i--)); do
      while (( (rand=$RANDOM) >= max )); do :; done
      rand=$(( rand % (i+1) ))
      tmp=${array[i]} array[i]=${array[rand]} array[rand]=$tmp
   done
}


## if we have dig and a list of dns methods, try that first
if hash dig 2>/dev/null && [ ${#dnslist[*]} -gt 0 ]; then
    eval array=( \"\${dnslist[@]}\" )
    shuffle

    for cmd in "${array[@]}"; do
        [ "$verbose" == 1 ] && echo Trying: $cmd 1>&2
        ip=$(timeout $timeout $cmd)
        if [ -n "$ip" ]; then
            echo $ip
            exit
        fi
    done
fi


# if we haven't succeeded with DNS, try HTTP

if [ ${#httplist[*]} == 0 ]; then
    echo "No hosts in httplist array!" >&2
    exit 1
fi

# use curl or wget, depending on which one we find
curl_or_wget=$(if hash curl 2>/dev/null; then echo "curl -s"; elif hash wget 2>/dev/null; then echo "wget -qO-"; fi);

if [ -z "$curl_or_wget" ]; then
    echo "Neither curl nor wget found. Cannot use http method." >&2
    exit 1
fi

eval array=( \"\${httplist[@]}\" )
shuffle

for url in "${array[@]}"; do
    [ "$verbose" == 1 ] && echo Trying: $curl_or_wget  "$url" 1>&2
    ip=$(timeout $timeout $curl_or_wget "$url")
    if [ -n "$ip" ]; then
        echo $ip
        exit
    fi
done

Sử dụng mẫu (tôi gọi là kịch bản myip):

$ myip
Trying: dig +short -t txt o-o.myaddr.l.google.com @ns1.google.com
"151.101.65.69"

$ ip=$(myip); echo "IP = '$ip'"
Trying: dig +short myip.opendns.com @resolver1.opendns.com
IP = '151.101.65.69'

Nhận xét verbosebiến ở đầu tập lệnh để tránh in máy chủ được sử dụng.

Cập nhật: tập lệnh này hiện cũng có trên Github, nơi tôi có thể cập nhật nó khi cần:
https://github.com/mivk/myip


3

Nếu bạn muốn sử dụng HTTPS để tránh một số cạm bẫy tiềm ẩn:

_result=$(wget -qO- https://ipcheckit.com/)
_result="${_result##*Your IP address is<br><b>}"
printf '%s\n' "${_result%%</b></p>*}"

2
Có lẽ bạn có thể giải thích về những cạm bẫy tiềm năng mà bạn đang tránh ở đây?
Caleb

Tên miền ipcheckit.com rõ ràng là để bán và không lưu trữ dịch vụ hiển thị địa chỉ IP nữa.
thao tác

à, những cạm bẫy của các tập lệnh writeonly :)
рос mặc dù chúng tôi làm việc vào

@Chris Xuống kỹ thuật vẫn còn hiệu lực, bạn chỉ cần một trang web có khả năng SSL khác để sử dụng nó.
Caleb

3

Đâ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.


3

Điều này luôn làm việc cho tôi, tôi sử dụng nó trong conky của tôi để lấy địa chỉ IP của tôi.

wget -q -O - checkip.dyndns.org | sed -e 's/[^[:digit:]\|.]//g'

+1 Mặc dù trông rất vụng về, cách tiếp cận này đã giúp tôi tiết kiệm rất nhiều lần. Bởi vì Internet không phải là WWW . Bạn có thể có quyền truy cập internet, nhưng bạn có thể (thường là trong các phòng máy chủ) phải chịu số phận của bảng điều khiển không phải GUI và trong trường hợp này, điều quan trọng cần nhớ một trong những URL dịch vụ checkIP. Và vì cái này khá phổ biến, nó chỉ có vẻ như được tổng hợp, vì bạn sẽ có khả năng nhớ DynDNS nhiều hơn một amazonaws. Đó là, nếu bạn KHÔNG có cách nào để google cho nó. (thậm chí không lynx).
cú pháp

3

Vì tôi không phụ thuộc vào kết nối hoặc dịch vụ, tôi sử dụng đoạn mã sau, cố gắng lấy IP bằng các dịch vụ khác nhau (vui lòng thêm nhiều hơn):

# Get my ip address and put in a file
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" ] # If no IP found yet, keep trying!
do
    sleep 30
    IP=$(curl -s --retry 3 --retry-delay 10 ${arr[$((  RANDOM % ${#arr[@]}  ))]})  
done

echo -n "$IP" >  /root/clientIP.txt #puts ip address in clientIP.txt
echo "Our address is $IP" 

Để thêm mạnh mẽ hơn (ví dụ: nếu một trong các dịch vụ thay đổi định dạng của chúng), bạn có thể kiểm tra đó $IPlà IP hợp lệ bằng cách sử dụng chức năng sau :

# Verify that the parameter passed is an IP Address:
# http://zindilis.com/blog/2013/05/10/bash-check-that-string-is-ip.html
# @Author: Marios Zindilis
# @License: Creative Commons Attribution-ShareAlike 4.0 International License.
# @Date: 2013-05-10
function is_IP() {
if [ `echo $1 | grep -o '\.' | wc -l` -ne 3 ]; then
        echo "Parameter '$1' does not look like an IP Address (does not contain 3 dots).";
        exit 1;
elif [ `echo $1 | tr '.' ' ' | wc -w` -ne 4 ]; then
        echo "Parameter '$1' does not look like an IP Address (does not contain 4 octets).";
        exit 1;
else
        for OCTET in `echo $1 | tr '.' ' '`; do
                if ! [[ $OCTET =~ ^[0-9]+$ ]]; then
                        echo "Parameter '$1' does not look like in IP Address (octet '$OCTET' is not numeric).";
                        exit 1;
                elif [[ $OCTET -lt 0 || $OCTET -gt 255 ]]; then
                        echo "Parameter '$1' does not look like in IP Address (octet '$OCTET' in not in range 0-255).";
                        exit 1;
                fi
        done
fi

return 0;
}

3

ifcfg.me hỗ trợ:

curl ifcfg.me
nslookup . ifcfg.me
telnet ifcfg.me
ftp ifcfg.me
finger @ifcfg.me

IPv4 và IPv6, thậm chí nhiều thứ hơn với curl: ifcfg.me/?


Làm thế nào để nslookupphương pháp liên quan đến digphương pháp trong câu trả lời của Krinkle ? Cả hai đều sử dụng DNS, phải không? Vì vậy, tôi có thể vượt qua một số tùy chọn để diglàm cho nó truy xuất bản ghi DNS tương tự nslookupđang làm ở đây không?
James Haigh

Vâng, bạn có thể sử dụng dig +short . @ifcfg.menếu bạn muốn
Eun

2

Tôi điều hành một dịch vụ đám mây cho gia đình và tôi đã tạo ra kịch bản nhanh này Tôi chạy vào cronmỗi buổi sáng lúc 5 giờ vì tôi không mua được IP tĩnh.

Nó lấy IP công cộng và gửi email cho người dùng của tôi. Làm cho nó email ở định dạng siêu liên kết để mẹ tôi không phải gõ các cổng hoặc bất cứ điều gì. Có lẽ người khác có thể sử dụng nó để.

#!/bin/bash
ipvariable=$(wget http://ipecho.net/plain -O - -q);

echo "Today the location is http://$ipvariable:123456/foldertheyreach" | mail -s   "From your friendly cloud service provider" user1@someemail.com, user2@ect.com

1

Điều này sẽ hiển thị địa chỉ IP hiện tại trong một cửa sổ bật lên:

zenity --info --text "$(curl -s icanhazip.com)"

1

Tôi đã thiết lập một dịch vụ trả về địa chỉ IP dưới dạng JSON / XML hoặc văn bản thuần túy. bạn có thể tìm họ ở đây

http://ipof.in/txt

Cùng một URL với / json và / xml cũng sẽ cung cấp cho bạn các định dạng khác

Nếu bạn muốn HTTPS, bạn có thể sử dụng cùng một URL với tiền tố https. Ưu điểm là ngay cả khi bạn đang sử dụng Wifi, bạn sẽ nhận được địa chỉ công khai.

Vì vậy, một bí danh đơn giản myip = "curl https://ipof.in/txt " sẽ nhận được IP của bạn


1

Ngoài ra, bạn có thể sử dụng STUN được phát minh để trả lời câu hỏi này theo cách tự động và được sử dụng rộng rãi trong truyền thông internet, ví dụ như SIPWebRTC .

Sử dụng stunclient (trên debian / ubfox do apt-get install stuntman-client) chỉ cần làm:

$ stunclient stun.services.mozilla.com
Binding test: success
Local address: A.B.C.D:42541
Mapped address: W.X.Y.Z:42541

nơi A.B.C.Dlà địa chỉ IP của máy tính của bạn trên mạng địa phương và W.X.Y.Zlà các máy chủ địa chỉ IP như các trang web nhìn thấy từ bên ngoài (và một trong những bạn đang tìm kiếm). Sử dụng sedbạn có thể giảm đầu ra ở trên chỉ còn một địa chỉ IP:

stunclient stun.services.mozilla.com |
    sed -ne "s/^Mapped address: \(.*\):.*$/\1/p"

Đối với một tra cứu STUN thay thế không sử dụng gì ngoài các công cụ dòng lệnh cơ bản, hãy xem câu trả lời của tôi trên AskUbfox (dự định là một bài tập thú vị, không sử dụng cho sản xuất).


0

Trình duyệt Plaintext-Trình duyệt w3m rất phù hợp cho bash. Bạn có thể sử dụng greptailrút ngắn trả lời như sau:

w3m -no-cookie -dump "http://www.whatismyip.com/" | grep -A 1 -m 1 "Your IP:" | tail -n 1


0

Sử dụng yêu cầu DNS ngay cả sau bộ định tuyến NAT dịch địa chỉ DNS, điều này có thể hoạt động:

$ dig +short -t txt o-o.myaddr.l.google.com @ns1.google.com | cut -d'"' -f2
x.y.z.t

hoặc, bạn có thể sử dụng phương thức yêu cầu HTTP thay thế:

$ curl -s ipinfo.io/ip
x.y.z.t

1
Tại sao bạn muốn giới thiệu cái này hơn cái kia?
roaima

@roaima Bạn nói đúng, tùy thuộc vào mỗi người dùng quyết định.
SebMa
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.