Như một bí danh được gọi myip
, nó sẽ hoạt động ở mọi nơi:
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])'"
- Hoạt động chính xác với Python 2.x, Python 3.x, các bản phân phối Linux hiện đại và cũ, OSX / macOS và Windows để tìm địa chỉ IPv4 hiện tại.
- Sẽ không trả về kết quả chính xác cho các máy có nhiều địa chỉ IP, IPv6, không có địa chỉ IP được định cấu hình hoặc không có truy cập internet.
Tương tự như trên, nhưng chỉ có mã 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])
- Điều này sẽ đưa ra một ngoại lệ nếu không có địa chỉ IP được cấu hình.
Phiên bản cũng sẽ hoạt động trên mạng LAN mà không cần kết nối 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])
(cảm ơn @ccpizza )
Lý lịch :
Việc sử dụng socket.gethostbyname(socket.gethostname())
không hoạt động ở đây, bởi vì một trong những máy tính tôi đang sử dụng /etc/hosts
có các mục và tham chiếu trùng lặp với chính nó. socket.gethostbyname()
chỉ trả về mục cuối cùng trong/etc/hosts
.
Đây là nỗ lực ban đầu của tôi, loại bỏ tất cả các địa chỉ bắt đầu bằng "127."
:
import socket
print([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")][:1])
Điều này hoạt động với Python 2 và 3, trên Linux và Windows, nhưng không xử lý một số thiết bị mạng hoặc IPv6. Tuy nhiên, nó đã ngừng hoạt động trên các bản phát hành Linux gần đây, vì vậy tôi đã thử kỹ thuật thay thế này. Nó cố gắng kết nối với máy chủ DNS của Google 8.8.8.8
tại cổng 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])
Sau đó, tôi đã kết hợp hai kỹ thuật trên thành một lớp lót có thể hoạt động ở mọi nơi và tạo ra myip
bí danh và đoạn mã Python ở đầu câu trả lời này.
Với sự phổ biến ngày càng tăng của IPv6 và đối với các máy chủ có nhiều giao diện mạng, sử dụng mô-đun Python của bên thứ ba để tìm địa chỉ IP có lẽ vừa mạnh mẽ vừa đáng tin cậy hơn bất kỳ phương pháp nào được liệt kê ở đây.