ฉันสามารถหาที่อยู่ IP ของฉันโดยใช้คำสั่ง ifconfig หรือ hostname -i
แต่ฉันจะค้นหา IP สาธารณะของฉันได้อย่างไร
(ฉันมี IP สาธารณะคงที่ แต่ฉันต้องการค้นหาโดยใช้คำสั่ง unix)
ฉันสามารถหาที่อยู่ IP ของฉันโดยใช้คำสั่ง ifconfig หรือ hostname -i
แต่ฉันจะค้นหา IP สาธารณะของฉันได้อย่างไร
(ฉันมี IP สาธารณะคงที่ แต่ฉันต้องการค้นหาโดยใช้คำสั่ง unix)
คำตอบ:
curl ifconfig.me
curl ifconfig.me/ip
(สำหรับ ip เท่านั้น)
curl ifconfig.me/all
(สำหรับข้อมูลเพิ่มเติมต้องใช้เวลา)
สำหรับคำสั่งเพิ่มเติมโปรดไปที่: http://ifconfig.me/#cli_wrap
curl http://checkip.amazonaws.com/
myip.opendns.com
คุณสามารถขอ จาก OpenDNS dig @208.67.222.220 myip.opendns.com
dig @resolver1.opendns.com myip.opendns.com
ง่ายต่อการจำรุ่นคุณสามารถวางไว้ใน หรือบน nslookup myip.opendns.com resolver1.opendns.com
Windows:
dig @208.67.222.220 myip.opendns.com +short
เพื่อที่จะได้รับ IP โดยตรงโดยไม่ต้องทำตามคำตอบทั้งหมด
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
dig +short AAAA myip.opendns.com @2620:0:ccc::2
OpenDNS:
-4
หรือ-6
หากคุณต้องการรุ่น IP ที่เฉพาะเจาะจง
anwser ง่ายมากถ้าคุณมีอินเทอร์เน็ตคือ:
curl icanhazip.com
โปรดจำไว้ว่าการเชื่อถือแหล่งข้อมูลของบุคคลที่สามสำหรับ IP ของคุณอาจเป็นปัญหาโดยเฉพาะถ้าสิ่งที่คุณทำกับข้อมูลนั้นมีความหมายพิเศษ
วิธีที่น่าเชื่อถือมากขึ้นคือการเลือกเซิร์ฟเวอร์ DNS ที่รู้จักและเชื่อถือได้ (เรียกใช้ DNSSEC) และสอบถามชื่อโฮสต์ของกล่องด้วยเพื่อให้เซิร์ฟเวอร์ DNS ของคุณมีรายการดังกล่าว
dig @trustworthysource.com +short `hostname`
ฉันเขียนเว็บเซอร์ที่ง่ายและรวดเร็วสำหรับเรื่องนี้
curl ident.me
คุณสามารถขอ IPv4 ของคุณ:
curl v4.ident.me
หรือ IPv6:
curl v6.ident.me
และ API จะถูกบันทึกไว้ในhttp://api.ident.me/
ทางเดียว: http://www.whatismyip.com/
ถ้า
จากนั้นคุณสามารถแยกเอาท์พุทจาก ifconfig สำหรับที่อยู่ IP ของอินเทอร์เฟซ (ส่วน "inet addr:") เพื่อรับรายการที่อยู่ IP ของอินเตอร์เฟสทั้งหมดของคุณ ที่อยู่ IP เดียวที่ไม่ได้อยู่ในช่วงส่วนตัว (ดูhttp://en.wikipedia.org/wiki/IP_address#IPv4_private_addresses ) เป็นที่อยู่ IP สาธารณะของคุณ
รายการเดียวกันยังสามารถได้รับผ่าน
ip addr show
ซึ่งอาจจะง่ายต่อการแยกวิเคราะห์
หากคุณไม่มีการเชื่อมต่ออินเทอร์เน็ตโดยตรง (NAT ฯลฯ ) คุณจะไม่สามารถหาที่อยู่ IP สาธารณะของคุณได้หากไม่มีความช่วยเหลือจากภายนอก (เนื่องจากคอมพิวเตอร์ของคุณไม่ทราบ) จากนั้นคุณจะต้องทำเหมือนในคำตอบอื่น ๆ
ฉันใช้วิธีการที่แตกต่างกันเล็กน้อยโดยใช้โปรโตคอล 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 จากผลลัพธ์
วิธีหนึ่งคือคุณสามารถส่งคำขอไปยังหน้าได้ที่
http://www.biranchi.com/ip.php
มันจะส่งคืนที่อยู่ IP ของระบบของคุณ
text/html
ไม่เป็นไรสำหรับสิ่งที่หลอกหลอก API กลับ - แน่นอนไม่ใช่ XML หรือ JSON text/plain
บางที text/html
แต่ก็สามารถใช้งานได้ทั้งเป็น
wget -q -O - http://wgetip.com/
Google แสดงที่อยู่ IP สาธารณะของคุณแล้ว: http://www.google.co.th/search?q=ip
User-Agent
สตริงที่ระบุให้กับหน้าเว็บ ด้วย Firefox มันใช้งานได้; แต่ SeaMonkey ที่มีสตริง "Firefox" ถูกปิดใช้งาน (ผ่าน "general.useragent.compatMode.firefox" ถูกตั้งค่าเป็นเท็จ) ก็ไม่ได้ ไม่มีข้อสงสัยใด ๆ ว่าทำไม Google จึงเปิดใช้งานสิ่งนี้อย่างชัดเจนสำหรับ Firefox แทน Gecko ใด ๆ เท่านั้นเนื่องจากมีเบราว์เซอร์เดสก์ท็อปอื่น ๆ อีกมากมายที่อิง Gecko ซึ่งเข้ากันได้อย่างเท่าเทียมกันรวมถึง SeaMonkey
โอเค ... ฉันรู้ว่านี่คือวิธีหลังจากความจริงและอาจไม่คุ้มค่าการโพสต์ แต่นี่เป็นวิธีการทำงานของฉัน
#!/bin/sh
IP="$(ifconfig | egrep 'inet ' | sed -e 's/inet //' -e 's/addr://' -e 's/ Bcast.*//' -e 's/127.*//')"
echo $IP
ดีและเรียบง่าย
hostname -I
(ตัวพิมพ์ใหญ่ 'i')
วิธีที่ง่ายที่สุดคือใช้http://ifconfig.me/ตามที่แนะนำ
ในหน้านี้คุณจะรู้ว่าคำสั่งที่จะใช้สำหรับข้อมูลที่คุณต้องการดึง
สำหรับ IP:
ifconfig.me ขดหรือ
ขด ifconfig.me/ip
สำหรับชื่อโฮสต์สาธารณะ:
ifconfig.me/host curl
สำหรับข้อมูลทั้งหมดในไฟล์ XML:
curl ifconfig.me/all.xml
ฯลฯ ... เพียงตรวจสอบhttp://ifconfig.me
ฉันทำสิ่งนี้มากมายและจากอุปกรณ์จำนวนมากดังนั้นฉันจึงสร้างบริการสองอย่างของฉันเองบนเซิร์ฟเวอร์:
ไฟล์ 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
แฮ็คอย่างรวดเร็วด้วยเซิร์ฟเวอร์เทลเน็ตที่กำหนดเอง: xinetd วางไข่ / 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 หรือพร็อกซีบางส่วนเกี่ยวข้องกับการสื่อสารและคุณต้องการทราบว่าคุณปรากฏ IP ใด
ไม่ต้องการบริการบุคคลที่สามใด ๆ
เพื่อหลีกเลี่ยงการพึ่งพาแหล่งภายนอกฉันใช้คาดว่าจะ 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
ฉันรันสคริปต์ด้านบนเช่นนี้เพื่อรับไอพีสาธารณะ:
./telnet2router.exp <router-ip> <username> <password> | grep "inet addr" | cut -d : -f 2 | cut -d " " -f 1
แน่นอนว่านี่เป็นไปตามข้อสันนิษฐานว่าฉันมีสิทธิ์การเข้าถึงระดับผู้ดูแลระบบของเราเตอร์และเราเตอร์ที่ใช้ linux ซึ่งมีคำสั่ง ifconfig
ทำซ้ำคำถามอื่น ๆ อีกมากมาย (ดังนั้นคะแนน -1 ของฉัน)
โซลูชันเชลล์สคริปต์แบบง่ายสามารถพบได้ที่นี่:
http://bash.cyberciti.biz/misc-shell/read-local-ip-address/
ทำงานบน Linux, FreeBSD, SunOS และ Apple Darwin (พร้อมการดัดแปลงเล็กน้อย)
หากสิ่งที่คุณต้องการคือการหาที่อยู่ IP ภายนอกบนเราเตอร์ของคุณคุณอาจขอให้เราเตอร์ตัวเองสำหรับที่อยู่ wan ของมันหรือขอให้คนภายนอกที่จะได้รับมันสำหรับคุณ ..
สำหรับวิธีการด้วยตนเองคุณสามารถเรียกดูไซต์ใด ๆ ที่ระบุด้านบนซึ่งจะส่งคืน ip ของคำขอที่ส่งเข้ามา
สำหรับวิธีอัตโนมัติคุณสามารถลอง:
wget -q -O - http://www.ipaddressworld.com | grep '[0-9]\{1,3\}\.[0-9]\{1,3\}'\.
ซึ่งจะทำให้คุณเห็นบรรทัดที่มีที่อยู่ IP ในการตอบกลับ http จากนั้นแยกวิเคราะห์ด้วย sed, awk และอื่น ๆ
คุณสามารถใช้เพียงเปลือกเพื่อตรวจสอบ 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 }"
line=${line%%</p>*}
echo "Your ip is: $line"
exec >&5-
exit
;;
esac
done <&5
เอาท์พุต
lynx --dump http://www.whatismyip.com/ | grep -o '[0-9]. * \. [0-9]. * \. [0-9]. * \. [0-9]. *' -m1
ฉันทำนี่. มันทำให้ฉัน IP โดยไม่ต้องมีส่วนร่วมของบุคคลที่สาม
แสดง IP addr | grep eth0 | grep inet | tr -s "" | ตัด -f3 -d "" | ตัด -f1 -d "/"
wget -q -O - checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//'
นี่คืออีกทางเลือกหนึ่งที่ขึ้นอยู่กับครอบครัวที่แก้ไขธุรกิจเกี่ยวกับการจัดการ IP แบบไดนามิกแทนที่จะเป็นเว็บไซต์ "บริการสาธารณะ" ที่อาจหายไปหรือเปลี่ยนรูปแบบ
1) ลงทะเบียนเซิร์ฟเวอร์ของคุณที่หนึ่งในบริการ dns ไดนามิกฟรีมากมาย (เช่น no-ip.com) ซึ่งจะให้รายการ DNS เช่น xxx.no-ip.org
2) ติดตั้งเครื่องมืออัพเดตแบบไดนามิกของบริการ (รายงานการเปลี่ยนแปลง IP เป็นบริการ)
ในการรับที่อยู่ IP ในสคริปต์ให้ทำดังนี้
$external_ip = `dig +short xxx.no-ip.org`
เหมาะสำหรับใช้ในงาน cron เพื่อตรวจสอบว่า IP แบบไดนามิกมีการเปลี่ยนแปลงหรือไม่และรายการการกำหนดค่าบางอย่างจำเป็นต้องเปลี่ยน
ใน OS X นี่คือสองวิธีง่ายๆในการรับทั้ง IP ส่วนตัวและสาธารณะ (พร้อมรหัสโบนัสหากคุณใช้ LaunchBar)
$ ipconfig getifaddr $1
# $1=en0 || en1 || en*
#!/bin/sh
title="$USER@$(HOSTNAME -s)"
text=$(ipconfig getifaddr en1)
open "x-launchbar:large-type?font-name=TerminalDosis-Light&string=$text&title=$title"
$ 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
#!/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"