การค้นหาที่อยู่ IP สาธารณะในเชลล์สคริปต์


39

ฉันสามารถหาที่อยู่ IP ของฉันโดยใช้คำสั่ง ifconfig หรือ hostname -i

แต่ฉันจะค้นหา IP สาธารณะของฉันได้อย่างไร

(ฉันมี IP สาธารณะคงที่ แต่ฉันต้องการค้นหาโดยใช้คำสั่ง unix)


คุณพยายามทำสิ่งนี้โดยทางโปรแกรมหรือไม่
Andrew Keith

ใช่ในเชลล์สคริปต์
ชานตานะโอะ

1
คุณใช้ Linux, MacOSX, FreeBSD หรือไม่? ผลลัพธ์ของ 'ifconfig' นั้นแตกต่างกันไปสำหรับระบบปฏิบัติการที่แตกต่างกันเหล่านี้และคำสั่ง 'ip' ไม่มีอยู่ใน MacOSX คุณกำลังมองหา IP ของคอมพิวเตอร์ของคุณ (คุณจะต้องเชลล์สคริปต์เพื่อแยกวิเคราะห์ ifconfig หรืออะไร) หรือเราเตอร์ของคุณ (เว็บไซต์ด้านล่างอาจทำงานได้)?
Stefan Lasiewski

คำตอบ:


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

@Aliostad รู้สึกอิสระที่จะโพสต์ไว้ :)
Farhan.K

@ Farhan.K argh, ป้องกัน: /
Aliostad

26

myip.opendns.comคุณสามารถขอ จาก OpenDNS dig @208.67.222.220 myip.opendns.com


8
มันเท่มาก สำหรับการใด ๆ dig @resolver1.opendns.com myip.opendns.comง่ายต่อการจำรุ่นคุณสามารถวางไว้ใน หรือบน nslookup myip.opendns.com resolver1.opendns.comWindows:
Michael Kropat

2
สิ่งที่ดีที่สุดสำหรับฉัน: dig @208.67.222.220 myip.opendns.com +shortเพื่อที่จะได้รับ IP โดยตรงโดยไม่ต้องทำตามคำตอบทั้งหมด
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


โปรดทราบว่าในขณะนี้ข้างต้นใช้งานได้กับ IPv4 เท่านั้น (ไม่มีตัวแก้ปัญหาใด ๆ ที่ดูเหมือนจะมี IPv6 ในปัจจุบัน แต่หากคุณไม่ได้-4ระบุไว้อย่างชัดเจน-t aคุณอาจเสี่ยงต่อการล่มสลายในอนาคต (ยกเว้น Google txtซึ่งอาจใช้งานได้จริง) IPv6 หนึ่งวันถ้าเปิดใช้งานอย่างถูกต้องโดย Google))

โปรดทราบว่าmyip.opendns.comสามารถแก้ไขได้โดยผ่านresolver1.opendns.comเท่านั้นไม่ใช่ด้วยauth1.opendns.com- ดังนั้นพวกเขาจึงดูเหมือนจะทำการขโมย DNS บางส่วนและอยู่กึ่งกลางชื่อโดเมนของตัวเอง! ดังนั้นคุณจะไม่สามารถใช้มันเพื่อหา IP ของจำแนกสุ่มเนื่องจากไม่มีสิทธิ์สำหรับresolver1.opendns.commyip.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 <ผมพบ dig +short AAAA myip.opendns.com @2620:0:ccc::2OpenDNS:
bufh

ปัจจุบันวิธีการรับระเบียน TXT จาก Google รองรับทั้ง IPv4 และ IPv6 ดังนั้นคุณควรระบุ-4หรือ-6หากคุณต้องการรุ่น IP ที่เฉพาะเจาะจง
Martin

12

anwser ง่ายมากถ้าคุณมีอินเทอร์เน็ตคือ:

curl icanhazip.com

โปรดจำไว้ว่าการเชื่อถือแหล่งข้อมูลของบุคคลที่สามสำหรับ IP ของคุณอาจเป็นปัญหาโดยเฉพาะถ้าสิ่งที่คุณทำกับข้อมูลนั้นมีความหมายพิเศษ

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

dig @trustworthysource.com +short `hostname`


7

ทางเดียว: http://www.whatismyip.com/


1
วิธีที่สอง: ipchicken.com
bobby

หรือหากคุณต้องการ 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 คุณสามารถติดตั้งแพ็คเกจ "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 จากผลลัพธ์


stun.l.google.com เร็วขึ้น: D
Zibri

3

วิธีหนึ่งคือคุณสามารถส่งคำขอไปยังหน้าได้ที่

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

มันจะส่งคืนที่อยู่ IP ของระบบของคุณ


มันทำหน้าที่เป็นข้อความธรรมดากับชนิดของ text / html แล้ว ...
bortzmeyer

มันไม่แสดง IP ของคุณในเบราว์เซอร์ของคุณ?

2
แต่ด้วยความผิดประเภท
bortzmeyer

@bortzmeyer เอ่อ "ประเภทที่ถูกต้อง" คืออะไร? text/htmlไม่เป็นไรสำหรับสิ่งที่หลอกหลอก API กลับ - แน่นอนไม่ใช่ XML หรือ JSON text/plainบางที text/htmlแต่ก็สามารถใช้งานได้ทั้งเป็น
ceejayoz

3
+1 สำหรับหน้าเว็บที่ไม่จำเป็นต้องมีการ grepping นอกจากนี้wget -q -O - http://wgetip.com/
xofer

3

Google แสดงที่อยู่ IP สาธารณะของคุณแล้ว: http://www.google.co.th/search?q=ip


มันไม่ทำงานสำหรับฉันไม่ว่าจะในเบราว์เซอร์หรือผ่านทางขด
Ladadadada

มันแปลกมาก Mine บอกว่า "ที่อยู่ IP สาธารณะของคุณคือ XX.XX.XXX.XX - เรียนรู้เพิ่มเติม" ที่ด้านบนก่อน serp แรก
Jake Wilson

ทำงานกับการเชื่อมต่อ 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 ลูกค้า | 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(ตัวพิมพ์ใหญ่ 'i')
Redsandro

3

วิธีที่ง่ายที่สุดคือใช้http://ifconfig.me/ตามที่แนะนำ

ในหน้านี้คุณจะรู้ว่าคำสั่งที่จะใช้สำหรับข้อมูลที่คุณต้องการดึง

สำหรับ IP:

ifconfig.me ขด
หรือ
ขด ifconfig.me/ip

สำหรับชื่อโฮสต์สาธารณะ:

ifconfig.me/host curl

สำหรับข้อมูลทั้งหมดในไฟล์ XML:

curl 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
    

    ด้วย netcat:

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

    บนเราเตอร์ Cisco:

    router#more http://myserver.com/index.php
    79.22.192.12
    
  2. แฮ็คอย่างรวดเร็วด้วยเซิร์ฟเวอร์เทลเน็ตที่กำหนดเอง: 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 ใด

ไม่ต้องการบริการบุคคลที่สามใด ๆ


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

ฉันรันสคริปต์ด้านบนเช่นนี้เพื่อรับไอพีสาธารณะ:

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

แน่นอนว่านี่เป็นไปตามข้อสันนิษฐานว่าฉันมีสิทธิ์การเข้าถึงระดับผู้ดูแลระบบของเราเตอร์และเราเตอร์ที่ใช้ linux ซึ่งมีคำสั่ง ifconfig


1


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]. *'
-m1 

0

ฉันทำนี่. มันทำให้ฉัน IP โดยไม่ต้องมีส่วนร่วมของบุคคลที่สาม

แสดง IP addr | grep eth0 | grep inet | tr -s "" | ตัด -f3 -d "" | ตัด -f1 -d "/"


3
เขาต้องการที่อยู่ IP สาธารณะของเขา ไม่ใช่คนท้องถิ่น
Jake Wilson


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

ใน OS X นี่คือสองวิธีง่ายๆในการรับทั้ง IP ส่วนตัวและสาธารณะ (พร้อมรหัสโบนัสหากคุณใช้ LaunchBar)

IP ส่วนตัว

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

LaunchBar Script

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

#!/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"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.