एक उपनाम के रूप में कहा जाता है 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])'"
- वर्तमान IPv4 पता खोजने के लिए Python 2.x, Python 3.x, आधुनिक और पुराने लिनक्स डिस्ट्रोस, OSX / macOS और विंडोज के साथ सही ढंग से काम करता है।
- कई 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])
यह लिनक्स और विंडोज पर पायथन 2 और 3 के साथ काम करता है, लेकिन कई नेटवर्क उपकरणों या आईपीवी 6 के साथ काम नहीं करता है। हालांकि, हाल ही में लिनक्स डिस्ट्रोस पर काम करना बंद कर दिया, इसलिए मैंने इसके बजाय इस वैकल्पिक तकनीक की कोशिश की। यह 8.8.8.8
पोर्ट पर Google DNS सर्वर से जुड़ने की कोशिश करता है 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
इस उत्तर के शीर्ष पर उपनाम और पायथन स्निपेट बनाया ।
IPv6 की बढ़ती लोकप्रियता के साथ, और कई नेटवर्क इंटरफेस वाले सर्वरों के लिए, आईपी पते को खोजने के लिए एक तीसरे पक्ष के पायथन मॉड्यूल का उपयोग करना संभवतः यहां सूचीबद्ध किसी भी तरीके से अधिक मजबूत और विश्वसनीय है।