Sebagai alias dipanggil myip
, itu harus bekerja di mana saja:
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])'"
- Bekerja dengan benar dengan Python 2.x, Python 3.x, distro Linux modern dan lama, OSX / macOS dan Windows untuk menemukan alamat IPv4 saat ini.
- Tidak akan mengembalikan hasil yang benar untuk mesin dengan beberapa alamat IP, IPv6, tidak ada alamat IP yang dikonfigurasi atau tidak ada akses internet.
Sama seperti di atas, tetapi hanya kode Python:
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])
- Ini akan mengeluarkan pengecualian jika tidak ada alamat IP yang dikonfigurasi.
Versi yang juga akan berfungsi pada LAN tanpa koneksi internet:
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])
(terima kasih @ccpizza )
Latar Belakang :
Penggunaan socket.gethostbyname(socket.gethostname())
tidak berfungsi di sini, karena salah satu komputer yang saya gunakan memiliki /etc/hosts
entri duplikat dan referensi untuk dirinya sendiri. socket.gethostbyname()
hanya mengembalikan entri terakhir ke/etc/hosts
.
Ini adalah upaya awal saya, yang menyingkirkan semua alamat yang dimulai dengan "127."
:
import socket
print([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")][:1])
Ini berfungsi dengan Python 2 dan 3, di Linux dan Windows, tetapi tidak berurusan dengan beberapa perangkat jaringan atau IPv6. Namun, itu berhenti bekerja pada distro Linux baru-baru ini, jadi saya mencoba teknik alternatif ini sebagai gantinya. Mencoba menghubungkan ke server DNS Google di 8.8.8.8
at port 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])
Lalu saya menggabungkan kedua teknik di atas menjadi satu-liner yang harus bekerja di mana-mana, dan menciptakan myip
potongan alias dan Python di bagian atas jawaban ini.
Dengan semakin populernya IPv6, dan untuk server dengan banyak antarmuka jaringan, menggunakan modul Python pihak ketiga untuk menemukan alamat IP mungkin lebih kuat dan dapat diandalkan daripada metode apa pun yang tercantum di sini.