Як називається псевдонім 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, сучасними та старими дистрибутивами Linux, OSX / macOS та Windows для пошуку поточної IPv4 адреси.
- Не поверне правильний результат для машин з декількома IP-адресами, IPv6, не налаштованою IP-адресою або відсутнім доступом до Інтернету.
Те саме, що вище, але тільки код 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])
- Це призведе до виключення, якщо не налаштовано жодну IP-адресу.
Версія, яка також буде працювати в локальних мережах без підключення до Інтернету:
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, тому я спробував цю альтернативну методику замість цього. Він намагається підключитися до сервера DNS Google 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-адреси, ймовірно, є більш надійним та надійним, ніж будь-який із перерахованих тут методів.