ฉันจะรับที่อยู่ IP ภายนอกในเชลล์สคริปต์ได้อย่างไร


273

ฉันต้องการค้นหาที่อยู่ IP ภายนอกของฉันจากเชลล์สคริปต์ ในขณะนี้ฉันใช้ฟังก์ชั่นนี้:

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

แต่มันขึ้นอยู่กับperl-libwww, perl-html-format, perl-html-treeติดตั้ง ฉันจะรับ IP ภายนอกของฉันได้อีกวิธีใด


8
IP ภายนอกหมายถึงอะไร คำตอบทั้งสองนี้ใช้ HTTP แล้ว การตอบสนองอาจเป็น IP ของพร็อกซีเซิร์ฟเวอร์ ISP ของคุณ (ซึ่งอาจเป็นสิ่งที่คุณต้องการ)
billpg

@billpg: ฉันหมายถึง IP ของเราเตอร์ NAT
Eugene Yarmash

จากนั้นคุณจะต้องใช้บริการเว็บ what-is-my-IP ที่ใช้ HTTPS อนิจจาฉันไม่รู้อะไรเลย
billpg

1
@billpg ipcheckit.com
Gilles

checkip.amazonaws.comใช้สิ่งนี้จากผู้ให้บริการที่มีชื่อเสียง
arulraj.net

คำตอบ:


441

ฉันขอแนะนำให้รับโดยตรงจากเซิร์ฟเวอร์ DNS

คำตอบอื่น ๆ ส่วนใหญ่ด้านล่างเกี่ยวข้องกับการผ่าน HTTP ไปยังเซิร์ฟเวอร์ระยะไกล บางส่วนจำเป็นต้องแยกวิเคราะห์เอาต์พุตหรือใช้ส่วนหัว User-Agent เพื่อให้เซิร์ฟเวอร์ตอบกลับเป็นข้อความธรรมดา การเปลี่ยนแปลงเหล่านั้นค่อนข้างบ่อย (ลงไปเปลี่ยนชื่อวางโฆษณาอาจเปลี่ยนรูปแบบผลลัพธ์ ฯลฯ )

  1. โปรโตคอลการตอบสนอง DNS เป็นมาตรฐาน (รูปแบบจะเข้ากันได้)
  2. ในอดีตบริการ DNS ( OpenDNS , DNS สาธารณะของ Google , .. ) มีแนวโน้มที่จะอยู่รอดได้นานขึ้นและมีความเสถียรมากขึ้นปรับขนาดได้มากขึ้นและโดยทั่วไปจะได้รับการดูแลมากกว่าบริการ HTTP อะไร whatismyip.com
  3. วิธีนี้เร็วกว่าโดยเนื้อแท้ (ไม่กี่มิลลิวินาที!)

การใช้digกับOpenDNSเป็นเครื่องมือแก้ไข:

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

อาจใช้นามแฝงในตัวคุณbashrcเพื่อให้ง่ายต่อการจดจำ

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

ตอบกลับด้วยที่อยู่ IP ธรรมดา:

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

วากยสัมพันธ์

(ตัวย่อจาก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)
             ...

ANYชนิดของแบบสอบถามส่งกลับทั้ง AAAA หรือบันทึก หากต้องการการเชื่อมต่อ IPv4 หรือ IPv6 โดยเฉพาะให้ใช้-4หรือ-6ตัวเลือกตามลำดับ

ที่จะต้องตอบสนองเป็นที่อยู่ IPv4 เปลี่ยนใด ๆ กับA; สำหรับ IPv6 ให้แทนที่ด้วยAAAAหมายเหตุว่าสามารถส่งคืนที่อยู่ที่ใช้สำหรับการเชื่อมต่อเท่านั้น ตัวอย่างเช่นเมื่อเชื่อมต่อผ่าน IPv6 จะไม่สามารถส่งคืนที่อยู่ A

เซิร์ฟเวอร์สำรองและตัวอย่าง

นอกเหนือจาก OpenDNS แล้วยังมีบริการ DNS ที่คล้ายกันที่ Akamai และ 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"

ตัวอย่างนามแฝงที่ร้องขอที่อยู่ IPv4 โดยเฉพาะ:

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

$ wanip4
80.100.192.168

และสำหรับ IPv6:

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

$ wanip6
2606:4700:4700::1111

การแก้ไขปัญหา

หากคำสั่งไม่ทำงานด้วยเหตุผลบางอย่างอาจมีปัญหากับผู้ให้บริการต้นน้ำเครื่องมือบรรทัดคำสั่งหรืออย่างอื่น เพื่อช่วยให้เข้าใจว่าเหตุใดจึงไม่ทำงานให้รันคำสั่งโดยไม่มี+shortตัวเลือกเพื่อเปิดเผยรายละเอียดของการสืบค้น DNS ตัวอย่างเช่น:

$ 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
คุณพูดถูกมันเร็วเกินไป ..
ราหุลปาติล

4
@ Krinkle นั่นเป็นคำตอบที่ยอดเยี่ยม myip.opendns.comGoogles Public DNS มีความเท่าเทียมกันหรือไม่?
Kannan Mohan

12
ฉันพบนี้จะเป็น ~ 19X curl http://canhazip.comเร็วกว่า ดูaskubuntu.com/a/427092/2273
Adam Monsen

3
รักการทำความสะอาดที่ดี / ไม่พึ่งพาวิธีนี้ดีกว่าข้อเสนออื่น ๆ ทั้งหมดเว้นแต่คุณจะผูกพันกับพอร์ต 80
binaryanomaly

5
โปรดทราบว่าในบางกรณีเราเตอร์ที่ให้บริการ NAT จะแปลการตอบสนอง DNS ด้วย (คุณสามารถดูwiki.nil.com/Network_address_translation_of_DNS_responses ได้ ); ในกรณีนี้คุณควรย้อนกลับไปหาคำตอบที่แนะนำวิธีการอื่นนอกเหนือจาก DNS
Razvan Stefanescu

146

หมายเหตุ: นี่เป็นเรื่องเกี่ยวกับที่อยู่ IP ภายนอก (เซิร์ฟเวอร์ที่อยู่บนอินเทอร์เน็ตจะเห็นเมื่อคุณเชื่อมต่อ) - หากคุณต้องการที่อยู่ IP ภายใน (ที่อยู่ที่คอมพิวเตอร์ของคุณใช้สำหรับการเชื่อมต่อซึ่งอาจแตกต่างกัน) ดูสิ่งนี้ คำตอบ

TL; DR - วิธีที่เร็วที่สุดในปี 2558

วิธีที่เร็วที่สุดโดยใช้ DNS:

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

หรือใช้externalip :

externalip dns

HTTP ที่เร็วที่สุดโดยใช้:

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

หรือใช้ externalip:

externalip http

HTTPS ที่เร็วที่สุดโดยใช้ใบรับรองที่ถูกต้อง:

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

หรือใช้ externalip:

externalip https

ใช้ telnet:

ด้วยncคำสั่ง:

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

หรือใช้ externalip:

externalip telnet

ด้วยtelnetคำสั่ง:

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

ใช้ FTP:

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

หรือใช้ externalip:

externalip ftp

ทั้งหมดข้างต้นสามารถเรียกใช้สคริปต์externalipของฉันเป็น:

externalip dns
externalip http
externalip https
externalip telnet
externalip ftp

ตอนนี้เป็นเรื่องยาว ...

มีตัวเลือกมากมายของเซิร์ฟเวอร์ต่าง ๆ ที่ให้บริการ IP ภายนอกโดยเฉพาะอย่างยิ่งผ่าน HTTP ที่โพสต์ที่นี่หรือที่อื่น ๆ

ฉันสร้างมาตรฐานเพื่อดูว่าสิ่งใดของพวกเขาดีกว่าคนอื่นและฉันก็ประหลาดใจกับผลลัพธ์ เช่น ifconfig.me ที่แนะนำอย่างกว้างขวางที่สุดก็มักจะช้าที่สุดสำหรับฉันบางครั้งใช้เวลาหลายวินาทีในการตอบสนอง หลายคนไม่ทำงานผ่าน HTTPS หรือทำงาน แต่มีใบรับรองที่ไม่ถูกต้อง บางคนมีเวลาตอบสนองที่ไม่สอดคล้องกันมาก

มาตรฐาน

HTTP และ HTTPS

นี่คือที่มาของสคริปต์ externalip-benchmark ของฉันที่ฉันใช้:

คุณสามารถรันด้วยตัวเองเพื่อดูว่าบริการใดที่กล่าวถึงที่นี่คุ้มค่ากับการใช้งาน:

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

ผลลัพธ์ของฉันที่ฉันได้รับเมื่อวันที่ 2015-04-03 จากวอร์ซอว์ - ที่อยู่มีการเปลี่ยนแปลงเพื่อปกป้องผู้บริสุทธิ์:

เวลาตอบสนอง http ที่ดีที่สุด:

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'

เวลาตอบสนอง https ที่ดีที่สุด:

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

(หมายเหตุ: มีการตอบกลับที่รวดเร็วพร้อมเนื้อหาที่ว่างเปล่าซึ่งไม่ถูกต้อง)

เวลา ping เฉลี่ยที่ดีที่สุด:

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/

นี่คือผลลัพธ์ที่ฉันได้รับเมื่อวันที่ 2015-04-03 จากอัมสเตอร์ดัม:

เวลาตอบสนอง http ที่ดีที่สุด:

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'

เวลาตอบสนอง https ที่ดีที่สุด:

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

เวลา ping เฉลี่ยที่ดีที่สุด:

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/

(999999 ปิงหมายถึงการสูญเสียแพ็กเก็ต 100%)

DNS

สำหรับการเปรียบเทียบที่นี่เป็นเวลาที่วิธีการอื่นจะทำการทดสอบในวันที่ 2015-06-16 จากวอร์ซอว์และอัมสเตอร์ดัม

โดยใช้:

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

มักจะใช้เวลา (เวลานาฬิกาแขวนจริง) เกี่ยวกับ:

  • 0.035 วินาทีจากวอร์ซอว์
  • 0.015 วินาทีจากอัมสเตอร์ดัม

มีตัวแก้ไขสี่ตัวที่สามารถใช้วิธีนี้ได้:

  • resolver1.opendns.com
  • resolver2.opendns.com
  • resolver3.opendns.com
  • resolver4.opendns.com

พวกเขาให้เวลาตอบสนองเท่ากันในวอร์ซอว์และอัมสเตอร์ดัม แต่นี่อาจไม่ใช่ในกรณีอื่น ๆ

ใช้ 208.67.222.222 - IP ของ resolver1.opendns.com แทนที่จะใช้ชื่อโดเมนนั้นเร็วกว่า:

  • 0.023 วินาทีจากวอร์ซอว์
  • 0.009 วินาทีจากอัมสเตอร์ดัม

แต่อาจไม่สามารถใช้งานได้ในอนาคตหาก IP มีการเปลี่ยนแปลง (แม้ว่าอาจเป็นไปได้สำหรับตัวแก้ไข DNS ที่รู้จักกันดี - บางทีฉันควรใช้ IP ในสคริปต์externalipของฉัน- โปรดแสดงความคิดเห็น)

Telnet

Telnet ที่มีncหรือtelnetคำสั่ง (ดูด้านบน) มักใช้เวลา:

  • 0.103 วินาทีจากวอร์ซอว์
  • 0.035 วินาทีจากอัมสเตอร์ดัม

(ไม่มีความแตกต่างที่สังเกตได้ระหว่างncและtelnetคำสั่ง)

FTP

  • 0.10 วินาทีจากวอร์ซอว์
  • 0.036 วินาทีจากอัมสเตอร์ดัม

ชื่อโดเมน

วิธีการทั้งหมดจะเร็วขึ้น (โดยเฉพาะเมื่อเรียกใช้เป็นครั้งแรก) เมื่อมีการใช้ที่อยู่ IP แทนชื่อโดเมนของบริการที่กำหนด (ยกเว้น HTTP ที่สามารถใช้เซิร์ฟเวอร์เสมือนที่ใช้โฮสต์ได้และไม่ทำงานกับ IP เปล่า - ไม่ได้ทดสอบ) แต่จะหยุดทำงานเมื่อบริการเปลี่ยนที่อยู่ IP ดังนั้นจึงอาจเร็วกว่า แต่มีหลักฐานน้อยกว่าในอนาคต

ความคิดเห็น

หากคุณเห็นผลลัพธ์ที่น่าสนใจจากที่ตั้งของคุณหรือถ้าคุณคิดว่าควรแนะนำโฮสต์อื่นแทนที่จะเป็นที่ฉันเลือกโปรดโพสต์ความคิดเห็น หากมีบริการที่สำคัญขาดหายไปโปรดแสดงความคิดเห็นหรือโพสต์ปัญหาใน GitHub ฉันต้องการอัปเดตโพสต์นี้ด้วยตัวเลือกปัจจุบันของบริการที่มีประสิทธิภาพดีที่สุด


2
คุณเปรียบเทียบมาตรฐานmyip.opendns.comDNS กับคำตอบของ Krinkleหรือไม่ ขณะนี้ดูเหมือนว่าจะเป็นผู้ชนะโดยค่าเริ่มต้นเนื่องจากไม่รู้ผู้ให้บริการรายอื่นสำหรับวิธีนี้ แต่ก็ยังคงมีประโยชน์ในการเปรียบเทียบกับวิธีอื่น ๆ
James Haigh

@JamesHaigh ขอบคุณสำหรับคำแนะนำ ฉันเพิ่ม DNS และวิธีอื่น ๆ (telnet, ftp) ในคำตอบ วิธีที่เร็วที่สุดคือ DNS โดยใช้ที่อยู่ IP โดยตรง (แทนที่จะเป็นชื่อโดเมน) ของโปรแกรมแก้ไข
rsp

คุณควรเพิ่ม / ทดสอบcanhazip.com / canhazip.comเช่นกัน (HTTP และ HTTPS)
xxdesmus

คุณสามารถเพิ่มmyip.addr.spaceในรายการของคุณ ฉันสร้างมันขึ้นมาเองเนื่องจากฉันไม่พอใจกับสิ่งที่ฉันได้เห็นในเวลานั้น
Michael Hampton

บางครั้งฉันได้ผลลัพธ์ที่แตกต่างกันโดยใช้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) และcurl http://canhazip.com(36.71.64.71) ฉันจะตัดสินใจได้อย่างไรว่าอันไหนถูกต้อง?
Sutandiono

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

แทนที่ไซต์ด้วยดัทช์ที่ใช้งานได้


3
+1 ฉันรู้เกี่ยวกับ whatismyip.com แต่ไม่ใช่ whatismyip.org นั่นยอดเยี่ยมมาก
Julian

ไม่เคยรู้เรื่องนี้เลย! เยี่ยมมาก!
bbosak

2
@MaciekSawicki เป็น-sตัวเลือกที่จำเป็นจริงๆในกรณีนี้หรือไม่? ฉันลองด้วย / ไม่ใช้มันใน fedora 15 - bash 4.2.10 (1) และมันใช้ได้ทั้งสองวิธี
ztank1013

4
ดูเหมือนจะไม่ทำงานอีกต่อไปผ่าน CLI แต่ไปที่หน้าเว็บจากเว็บเบราว์เซอร์ใช้งานได้ ฉันใช้ openSUSE 12.1 x64
SaultDon

5
whatismyip.comได้ลบบริการฟรีเพื่อตรวจสอบ IP ภายนอก ดังนั้นฉันจึงกลัวว่านี่จะไม่ถูกต้องอีกต่อไป icanhazip.comยังคงใช้งานได้
daSong

54

ตั้งแต่whatsmyip.orgและifconfig.meได้ถูกกล่าวถึงแล้ว:

curl -s icanhazip.com

4
อีกอันหนึ่ง: ip.appspot.comหรือip.appspot.com
Lekensteyn

1
ทั้งสองรองรับ IPv6
Josh Lee

1
@JoshLee โปรดทราบว่าicanhazipรองรับ ipv6 ด้วย นอกจากนี้หมายเหตุถึง OP curlโซลูชันเหล่านี้ทั้งหมด(แต่ใช้ได้) ยังขึ้นอยู่กับไลบรารีภายนอก ( libcurl)
HalosGhost

อีกอันหนึ่ง: ifcfg.me
Eun

18

คุณสามารถใช้ifconfig.meเป็นทางเลือกแทน whatismyip.org

curl -s http://ifconfig.me

นอกจากนี้ ifconfig.me ยังมีฟังก์ชั่นเพิ่มเติมบางอย่าง เพื่อหาข้อมูลอื่นที่คุณสามารถรับได้ที่เว็บไซต์


5
มันช้ามาก ฉันมักจะได้รับการตอบสนองครั้งในช่วงเวลา 30 วินาทีบางครั้งแม้กระทั่งในนาที! บางครั้งก็ครึ่งวินาที (ซึ่งยังคงมีจำนวนมาก) และจากนั้นก็ 15 วินาทีหรือมากกว่านั้น นี่คือการทดสอบจากสถานที่ที่แตกต่างกัน ดูคำตอบของฉันสำหรับข้อมูลเพิ่มเติมและมาตรฐาน
rsp

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

3
ฉันไม่สามารถรับ IP ของฉันแบบนี้ได้เพียงให้มันเป็น:<img src='ipimg.php'/>
Yuugian

มันใช้งานได้กับเวทมนตร์ของ regex แต่มันไม่ง่ายเลย หากคุณยืนยันในการใช้บริการนี้ให้แน่ใจว่าได้ตัดบรรทัดนั้นลงในสคริปต์:$ curl -s http://whatismyip.org | grep -o '\([[:digit:]]\{1,3\}\.\)\{3\}[[:digit:]]\{1,3\}'
ไวยากรณ์เมื่อ

13

Amazon AWS

curl https://checkip.amazonaws.com

ตัวอย่างผลลัพธ์:

123.123.123.123

ฉันชอบมันเพราะ:

  • มันจะส่งกลับเฉพาะ IP ธรรมดา ๆ ไม่มีอะไรอื่น
  • มันมาจากผู้ให้บริการที่รู้จักกันดีซึ่งไม่น่าจะออฟไลน์ได้ทุกเวลาเร็ว ๆ นี้

9

ฉันชอบที่จะใช้ curlmyip.com มันง่ายเหมือน:

curl curlmyip.com

สั้นและง่ายต่อการจดจำ


สำหรับใช้ในbash- เจตนาของ OP - คุณไม่สามารถทำได้หากไม่มี-sตัวเลือกที่ระบุไว้ในคำตอบอื่น ๆ
Serge Stroobandt

3
@SergeStroobandt ใช่คุณทำได้ -sสวิตช์ทั้งหมดทำงานในโหมดเงียบเช่น ข้อความผิดพลาดจะไม่ปรากฏขึ้น ดังนั้นเขาจึงต้องการให้สคริปต์ของเขาจัดการกับข้อผิดพลาด คำสั่งที่ตัวเองจะกลับที่อยู่ IP -sเป็นที่เชื่อถือได้เป็นใช้
Garrett Fogerlie

1
จนถึงตอนนี้ไซต์นี้น่าเชื่อถือที่สุดในการทดสอบหลายครั้ง
Amos Shapira

9
curl ident.me

หรือ

curl ifconfig.me

หรือ

curl tnx.nl/ip

หรือ

curl ipecho.net/plain

หรือ

curl ip.appspot.com

หรือ

curl whatismyip.akamai.com

หรือ

curl icanhazip.com

หรือ

curl wgetip.com

หรือ

curl ip.tyk.nu

หรือ

curl curlmyip.com

หรือ

curl corz.org/ip

หรือ

curl bot.whatismyipaddress.com

การอ้างอิง


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

เอาท์พุทที่นี่ที่ว่างเปล่าแม้ว่าไซต์จะทำงาน มีความคิดอะไรไหม ฉันอยู่หลังพรอกซีถ้าเกี่ยวข้อง แต่wget icanhazip.comใช้ได้
l0b0

@ l0b0 พยายามที่จะละเว้น| tail -n1ส่วนและดูสิ่งที่คุณได้รับจากพร็อกซี่
ยูจีน Yarmash

ไม่มีอะไรเลยเพียงแค่ออกจากรหัส 1. netcat icanhazip.com 80เหมือนกัน ดูเหมือนว่ามันจะไม่สนใจ$http_proxyและเป็นเพื่อนเพราะการระบุพร็อกซีและพอร์ตโดย-xเพียงแค่ส่งผลให้กระบวนการแฮงค์
l0b0

@ l0b0: netcat proxy 3128 <<<$'GET http://icanhazip.com/ HTTP/1.0\n\n' | tail -n 1สำหรับพร็อกซี HTTP พื้นฐาน (สมมติว่าทำงานบนพอร์ต 3128) คุณจะได้รับที่อยู่ IP ของพร็อกซี่กลับอย่างชัดเจน
tripleee

1
HTTP 1.0 ไม่มีHost:ส่วนหัวคำขอ - การโฮสต์เสมือนตามชื่อเป็นหนึ่งในการปรับปรุงที่สำคัญใน HTTP 1.1 เปลี่ยนคำขอเพื่อระบุ HTTP / 1.1 หรือลบส่วนหัวของโฮสต์ (ฉันขอแนะนำก่อนหน้านี้)
CVn

4

หากหลังจากอ่านคำแนะนำเหล่านี้ทั้งหมดที่คุณต้องการอ่านเพิ่มเติมแล้วนี่คือสคริปต์ Bash ที่มีเนื้อหามากกว่าที่กำหนดไว้

มันมีรายการของ DNS และเซิร์ฟเวอร์ HTTP ซึ่งดูเหมือนว่าจะทำงานได้ดี ณ เดือนกุมภาพันธ์ 2017

หากคุณมีdigก่อนจะลอง DNS ซึ่งเกือบจะเป็นลำดับความสำคัญเร็วกว่าที่บริการ HTTP ต่างๆ

มันออกจากคำตอบแรกที่ได้รับ

หากคุณไม่มีdigหรือหากเซิร์ฟเวอร์ DNS ทั้งหมดล้มเหลวให้ลองใช้บริการ HTTP จนกว่าจะได้รับคำตอบ

เซิร์ฟเวอร์จะแสดงรายการตามตัวอักษร แต่มีการสับก่อนใช้เพื่อหลีกเลี่ยงการใช้เซิร์ฟเวอร์เดียวกันเสมอ

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

ตัวอย่างการใช้งาน (ฉันเรียกว่าสคริปต์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'

ใส่ความคิดเห็นverboseตัวแปรที่ด้านบนของสคริปต์เพื่อหลีกเลี่ยงการพิมพ์เซิร์ฟเวอร์ที่ใช้

อัปเดต: สคริปต์นี้อยู่ใน Github ด้วยซึ่งฉันอาจอัปเดตเมื่อจำเป็น:
https://github.com/mivk/myip


3

หากคุณต้องการใช้ HTTPS เพื่อหลีกเลี่ยงข้อผิดพลาดที่อาจเกิดขึ้น:

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

2
บางทีคุณอาจอธิบายรายละเอียดเกี่ยวกับข้อผิดพลาดที่อาจเกิดขึ้นได้ที่นี่
คาเลบ

โดเมน ipcheckit.com เห็นได้ชัดว่ามีไว้สำหรับการขายและไม่ได้โฮสต์ที่อยู่ IP ที่แสดงบริการอีกต่อไป
จัดการ

อา, ข้อผิดพลาดของสคริปต์แบบเขียนอย่าง
ЯрославРахматуллин

@Chris Down เทคนิคนี้ยังใช้ได้อยู่คุณเพียงแค่ต้องมีไซต์ที่สามารถใช้ SSL อีกไซต์เพื่อใช้งานได้
Caleb

3

นี่คืออีกทางเลือกหนึ่งที่ขึ้นอยู่กับครอบครัวที่แก้ไขธุรกิจเกี่ยวกับการจัดการ IP แบบไดนามิกแทนที่จะเป็นเว็บไซต์ "บริการสาธารณะ" ที่อาจหายไปหรือเปลี่ยนรูปแบบ

  1. ลงทะเบียนเซิร์ฟเวอร์ของคุณที่หนึ่งในบริการ DNS แบบไดนามิกฟรีมากมาย (เช่น no-ip.com) สิ่งนี้จะให้รายการ DNS เช่น xxx.no-ip.org
  2. ติดตั้งเครื่องมืออัพเดตแบบไดนามิกของบริการ (รายงานการเปลี่ยนแปลง IP เป็นบริการ)

ในการรับที่อยู่ IP ในสคริปต์ให้ทำดังนี้

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

เหมาะสำหรับใช้ในงาน cron เพื่อตรวจสอบว่า IP แบบไดนามิกมีการเปลี่ยนแปลงหรือไม่และรายการการกำหนดค่าบางอย่างจำเป็นต้องเปลี่ยน


3

มันใช้งานได้ดีสำหรับฉันฉันใช้มันใน conky เพื่อรับที่อยู่ IP ของฉัน

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

+1 ถึงแม้จะดูเงอะงะวิธีการนี้ช่วยชีวิตฉันได้สองสามครั้ง เพราะอินเทอร์เน็ตไม่ได้ดูรายละเอียด คุณสามารถเชื่อมต่ออินเทอร์เน็ตได้ แต่คุณ (ปกติอยู่ในห้องเซิร์ฟเวอร์) ถึงวาระที่ไม่ใช่คอนโซล GUI และในกรณีนี้สิ่งสำคัญคือให้จำด้วยใจหนึ่งใน URL บริการตรวจสอบของIP และเป็นหนึ่งในนี้เป็นเรื่องธรรมดาสวยก็เป็นเพียงดูเหมือน compilcated เป็นคุณจะมีแนวโน้มที่จะจำได้ว่าหนึ่ง DynDNS amazonawsกว่าหนึ่ง นั่นคือถ้าคุณไม่มีวิธี google เพื่อมัน (ไม่ได้lynx)
ไวยากรณ์

3

เนื่องจากฉันไม่พึ่งพาการเชื่อมต่อหรือบริการฉันใช้รหัสต่อไปนี้ซึ่งพยายามรับ IP ที่ใช้บริการต่าง ๆ (รู้สึกฟรีเพื่อเพิ่มมากขึ้น):

# 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" 

ในการเพิ่มความทนทาน (เช่นหากบริการหนึ่งเปลี่ยนรูปแบบ) คุณสามารถตรวจสอบว่า$IPเป็น IP ที่ถูกต้องโดยใช้ฟังก์ชั่นต่อไปนี้:

# 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รองรับ:

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

IPv4 และ IPv6 มีอะไรเพิ่มเติมกับ curl: ifcfg.me/?


วิธีนี้nslookupเกี่ยวข้องกับdigวิธีการในคำตอบของ Krinkleอย่างไร พวกเขาทั้งสองใช้ DNS ใช่มั้ย ดังนั้นฉันสามารถส่งตัวเลือกเพื่อdigให้ดึงข้อมูลระเบียน DNS เดียวกับที่nslookupทำที่นี่ได้หรือไม่
James Haigh

ใช่คุณสามารถใช้dig +short . @ifcfg.meถ้าคุณต้องการ
Eun

2

ฉันใช้บริการคลาวด์สำหรับครอบครัวของฉันและฉันทำสคริปต์ฉบับย่อนี้ที่ฉันทำงานcronทุกเช้าที่ 5 เพราะฉันราคาถูกและจะไม่ซื้อ IP แบบคงที่

มันคว้า IP สาธารณะและส่งอีเมลถึงผู้ใช้ของฉัน ทำให้มันเป็นอีเมลในรูปแบบไฮเปอร์ลิงก์ดังนั้นแม่ของฉันไม่จำเป็นต้องพิมพ์พอร์ตหรืออะไรก็ตาม บางทีคนอื่นสามารถใช้มันเพื่อ

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

นี่จะแสดงที่อยู่ IP ปัจจุบันในหน้าต่างป๊อปอัป:

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

1

ฉันมีการตั้งค่าบริการที่ส่งคืนที่อยู่ IP เป็น JSON / XML หรือข้อความธรรมดา คุณสามารถค้นหาได้ที่นี่

http://ipof.in/txt

URL เดียวกันกับ / json และ / xml จะให้รูปแบบอื่นเช่นกัน

หากคุณต้องการ HTTPS คุณสามารถใช้ URL เดียวกันกับคำนำหน้า https ข้อดีคือแม้ว่าคุณจะอยู่บน Wifi คุณจะได้รับที่อยู่สาธารณะ

ดังนั้นนามแฝงง่ายๆ myip = "curl https://ipof.in/txt " จะได้รับ IP ของคุณ


1

หรือคุณสามารถใช้STUNซึ่งถูกคิดค้นขึ้นมาเพื่อตอบคำถามนี้ในทางอัตโนมัติและมีการใช้อย่างกว้างขวางในการสื่อสารทางอินเทอร์เน็ตเช่นโดยSIPและWebRTC

การใช้ stunclient (บน debian / ubuntu do apt-get install stuntman-client) ทำได้โดยง่าย:

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

ที่A.B.C.Dอยู่ IP ของเครื่องของคุณบนเครือข่ายท้องถิ่นและW.X.Y.Zเป็นที่อยู่ IP ของเซิร์ฟเวอร์เช่นเว็บไซต์ที่ดูจากภายนอก (และที่อยู่ที่คุณต้องการ) การใช้sedคุณสามารถลดผลลัพธ์ข้างต้นให้เหลือเพียงที่อยู่ IP:

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

สำหรับการค้นหา STUN ทางเลือกโดยไม่ใช้อะไรนอกจากเครื่องมือบรรทัดคำสั่งพื้นฐานดู คำตอบของฉันบน AskUbuntu (ตั้งใจให้ออกกำลังกายอย่างสนุกสนานไม่ใช่เพื่อการใช้งานจริง)


0

Plaintext-Browser w3m ยอดเยี่ยมสำหรับการทุบตี คุณสามารถใช้grepและtailย่อการตอบกลับได้ดังนี้:

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


0

การใช้คำขอ DNS แม้จะอยู่เบื้องหลัง NAT เราเตอร์ที่แปล DNS ก็สามารถใช้งานได้:

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

หรือคุณสามารถใช้วิธีการร้องขอ HTTP แทน:

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

1
ทำไมคุณถึงแนะนำอีกอันหนึ่ง?
roaima

@roaima คุณถูกต้องมันขึ้นอยู่กับผู้ใช้แต่ละคนที่จะตัดสินใจ
SebMa
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.