ในฐานะนามแฝงที่เรียกmyip
ว่าควรทำงานได้ทุกที่:
alias myip="python -c 'import socket; print([l for l in ([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith(\"127.\")][:1], [[(s.connect((\"8.8.8.8\", 53)), s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)]][0][1]]) if l][0][0])'"
- ทำงานได้อย่างถูกต้องกับ Python 2.x, Python 3.x, ดิสทริบิวชัน distros Linux รุ่นเก่าและใหม่, OSX / macOS และ Windows สำหรับค้นหาที่อยู่ IPv4 ปัจจุบัน
- จะไม่ส่งคืนผลลัพธ์ที่ถูกต้องสำหรับเครื่องที่มีที่อยู่ IP หลายแห่ง, IPv6, ไม่มีที่อยู่ IP ที่กำหนดค่าไว้หรือไม่มีการเข้าถึงอินเทอร์เน็ต
เหมือนข้างบน แต่เป็นเพียงรหัสงูหลาม:
import socket
print([l for l in ([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")][:1], [[(s.connect(('8.8.8.8', 53)), s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)]][0][1]]) if l][0][0])
- สิ่งนี้จะทำให้เกิดข้อยกเว้นหากไม่มีการกำหนดค่าที่อยู่ IP
เวอร์ชันที่สามารถใช้งานบน LAN ได้โดยไม่ต้องเชื่อมต่ออินเทอร์เน็ต:
import socket
print((([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")] or [[(s.connect(("8.8.8.8", 53)), s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)]][0][1]]) + ["no IP found"])[0])
(ขอบคุณ@ccpizza )
พื้นหลัง :
การใช้socket.gethostbyname(socket.gethostname())
ไม่ทำงานที่นี่เพราะคอมพิวเตอร์เครื่องหนึ่งที่ฉันใช้/etc/hosts
มีรายการที่ซ้ำกันและมีการอ้างอิงถึงตัวเอง socket.gethostbyname()
ส่งกลับเฉพาะรายการสุดท้าย/etc/hosts
เท่านั้น
นี่เป็นความพยายามครั้งแรกของฉันซึ่งกำจัดที่อยู่ทั้งหมดที่เริ่มต้นด้วย"127."
:
import socket
print([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")][:1])
สิ่งนี้ใช้ได้กับ Python 2 และ 3 บน Linux และ Windows แต่ไม่ได้จัดการกับอุปกรณ์เครือข่ายหลายตัวหรือ IPv6 อย่างไรก็ตามมันหยุดทำงานกับ Linux distros เมื่อเร็ว ๆ นี้ดังนั้นฉันจึงลองใช้เทคนิคทางเลือกนี้แทน พยายามเชื่อมต่อกับเซิร์ฟเวอร์ Google DNS 8.8.8.8
ที่พอร์ต53
:
import socket
print([(s.connect(('8.8.8.8', 53)), s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)]][0][1])
จากนั้นฉันรวมเทคนิคทั้งสองข้างต้นเป็นหนึ่งซับที่ควรทำงานได้ทุกที่และสร้างข้อมูลmyip
นามแฝงและ Python ที่ด้านบนของคำตอบนี้
ด้วยความนิยมที่เพิ่มขึ้นของ IPv6 และสำหรับเซิร์ฟเวอร์ที่มีอินเทอร์เฟซเครือข่ายหลายตัวการใช้โมดูล Python ของบุคคลที่สามสำหรับการค้นหาที่อยู่ IP น่าจะเป็นทั้งที่แข็งแกร่งและเชื่อถือได้กว่าวิธีการใด ๆ ที่ระบุไว้ที่นี่