Bir takma ad olarak myip
, bu her yerde çalışması gerekir:
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])'"
- Geçerli IPv4 adresini bulmak için Python 2.x, Python 3.x, modern ve eski Linux dağıtımları, OSX / macOS ve Windows ile doğru şekilde çalışır.
- Birden fazla IP adresi, IPv6, yapılandırılmış IP adresi veya internet erişimi olmayan makineler için doğru sonucu döndürmez.
Yukarıdaki ile aynı, ancak sadece Python kodu:
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])
- Hiçbir IP adresi yapılandırılmamışsa bu bir istisna atar.
İnternet bağlantısı olmayan LAN'larda da çalışacak sürüm:
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])
(teşekkürler @ccpizza )
Arkaplan :
Kullanmak socket.gethostbyname(socket.gethostname())
burada işe yaramadı, çünkü bulunduğum bilgisayarlardan birinde /etc/hosts
yinelenen girişler ve kendisine referanslar vardı . socket.gethostbyname()
yalnızca içindeki son girişi döndürür /etc/hosts
.
Bu başlayarak tüm adreslere eler benim ilk girişimi oldu "127."
:
import socket
print([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")][:1])
Bu, Linux ve Windows üzerinde Python 2 ve 3 ile çalışır, ancak birkaç ağ cihazı veya IPv6 ile ilgilenmez. Ancak, son Linux dağıtımları üzerinde çalışmayı bıraktı, bu yüzden bunun yerine bu alternatif tekniği denedim. Hiç de Google DNS sunucusuna bağlanmaya çalışır 8.8.8.8
limanında 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])
Daha sonra yukarıdaki iki tekniği, her yerde çalışması gereken tek bir myip
astarda birleştirdim ve bu cevabın üstünde takma ad ve Python snippet'i oluşturdum .
IPv6'nın artan popülaritesi ve birden çok ağ arayüzüne sahip sunucular için, IP adresini bulmak için üçüncü taraf bir Python modülü kullanmak, muhtemelen burada listelenen yöntemlerden daha sağlam ve güvenilirdir.