Вопрос или проблема
Сегодня я получил новый сервер Ubuntu. Я пытался получить его IP-адрес с помощью команд ifconfig
или ip
.
Но я получил ошибку команда не найдена
. Я искал ошибки в Google, и похоже, что мне нужно установить пакет, чтобы запустить эти команды.
Но у меня нет доступа sudo
. Есть ли другой способ получить IP-адрес без этих команд?
Если имена хостов настроены правильно (например, в /etc/hosts
), hostname -i
предоставит локальный IP-адрес. Если нет, или если у вас несколько IP-адресов, он, вероятно, вернет адрес localhost 127.0.0.1
. Команда hostname -I
выведет все локальные IP-адреса машины (v4 и v6).
$ lsb_release -d
Описание: Ubuntu 22.04.5 LTS
$ hostname -i
127.0.1.1
$ hostname -I
192.168.100.73 172.17.0.1 172.20.0.1
$ hostname -V
hostname 3.23
$ which hostname
/usr/bin/hostname
$ dpkg -S /usr/bin/hostname
dpkg-query: путь, соответствующий шаблону /usr/bin/hostname, не найден
Вы можете попробовать использовать Python. Он установлен по умолчанию на большинстве дистрибутивов. Им очень легко пользоваться.
$python
>>> import netifaces as ni
>>> ni.interfaces()
['lo', 'eth0','eth1','eth2']
>>> ni.ifaddresses('eth0')
{17: [{'addr': '02:93:07:be:da:d9', 'broadcast': 'ff:ff:ff:ff:ff:ff'}], 2: [{'addr': '10.0.0.76', 'netmask': '255.255.255.0', 'broadcast': '10.0.0.255'}], 10: [{'addr': 'fe80::93:7ff:febe:dad9%eth0', 'netmask': 'ffff:ffff:ffff:ffff::'}]}
В приведенном выше примере есть четыре интерфейса: lo, eth0, eth1, eth2. IP-адрес для eth0 – 10.0.0.76.
Сервер Linux может иметь более одного сетевого интерфейса. Вы можете ознакомиться с моим постом на моем сайте здесь, чтобы получить больше информации об этом.
Этот скрипт на Python отображает MAC-адрес, IP-адрес и маску подсети для каждого сетевого интерфейса.
Вот еще один способ получить IP-адрес без использования пакета Python:
import socket
import fcntl
import struct
def get_ip_address(ifname):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
return socket.inet_ntoa(fcntl.ioctl(
s.fileno(),
0x8915, # SIOCGIFADDR
struct.pack('256s', ifname[:15])
)[20:24])
get_ip_address('eth0') # '192.168.0.110'
Вы можете ознакомиться с этим постом, чтобы узнать больше о том, как использовать Python для получения IP-адреса.
Если вы просто пользователь на сервере Ubuntu, и администратор отключил ваш доступ к определенным инструментам, может быть трудно определить, какие инструменты у вас доступны. Команда ip
обычно доступна конечным пользователям, но, возможно, есть проблема с путями (маловероятно):
/usr/bin/ip addr show
# или
/bin/ip addr show
# или (может быть ограничено)
/sbin/ip addr show
В качестве альтернативы вы можете попробовать использовать curl
, чтобы получить доступ к внешнему сервису, который обнаружит ваш публичный IP-адрес. Таких сервисов достаточно много – я просто воспользовался первым результатом поиска:
curl ifconfig.me/all
Вот решение, основанное на ответе @howtouselinux, которое вы можете просто скопировать и вставить.
python3 <<HEREDOC
import netifaces as ni
import pprint
interfaces = ni.interfaces()
print("\n", "Интерфейсы:", interfaces)
for iface in interfaces:
ifconfig = ni.ifaddresses(iface)
pprint.pprint(ifconfig)
HEREDOC
Вывод
Интерфейсы: ['lo', 'enp0s1']
{2: [{'addr': '127.0.0.1', 'netmask': '255.0.0.0', 'peer': '127.0.0.1'}],
10: [{'addr': '::1',
'netmask': 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128'}],
17: [{'addr': '00:00:00:00:00:00', 'peer': '00:00:00:00:00:00'}]}
{2: [{'addr': '192.168.1.215',
'broadcast': '192.168.1.255',
'netmask': '255.255.255.0'}],
10: [{'addr': 'fe80::b:d8ff:fe61:58a%enp0s1',
'netmask': 'ffff:ffff:ffff:ffff::/64'}],
17: [{'addr': '02:0b:d8:65:0b:8a', 'broadcast': 'ff:ff:ff:ff:ff:ff'}]}
Ответ или решение
Получить IP-адрес на сервере Ubuntu без использования команд ifconfig
или ip
может быть непросто, особенно если у вас нет привилегий sudo
для установки необходимых пакетов. Однако существует несколько альтернативных способов, позволяющих решить эту задачу. Вот подробное руководство, которое поможет вам успешно получить IP-адрес в такой ситуации.
Использование команды hostname
Одним из простейших методов является использование команды hostname
. Эта команда позволяет получить информацию о системе, включая IP-адреса сети.
- Команда для получения IP-адреса:
hostname -I
Эта команда покажет все локальные IP-адреса (IPv4 и IPv6). Если у вас несколько сетевых интерфейсов, то они все будут перечислены.
Использование Python
Если на вашем сервере установлен Python (что вероятно, так как он входит в стандартный дистрибутив), вы можете воспользоваться следующим подходом:
- Использование библиотеки
netifaces
:
Эта библиотека позволяет извлекать информацию о сетевых интерфейсах.
python3 -c "import netifaces as ni; print(ni.ifaddresses(ni.interfaces()[0]))"
Этот код выведет информацию о первом сетевом интерфейсе. Если вы хотите получить IP-адреса всех интерфейсов, вы можете воспользоваться следующим скриптом:
import netifaces as ni
import pprint
interfaces = ni.interfaces()
print("Interfaces:", interfaces)
for iface in interfaces:
ifconfig = ni.ifaddresses(iface)
pprint.pprint(ifconfig)
Вы можете запустить этот скрипт через командную строку следующим образом:
python3 - <<EOF
import netifaces as ni
import pprint
interfaces = ni.interfaces()
print("\n", "Interfaces:", interfaces)
for iface in interfaces:
ifconfig = ni.ifaddresses(iface)
pprint.pprint(ifconfig)
EOF
- Использование сокетов и библиотеки
fcntl
:
Если вы хотите получить IP-адрес конкретного интерфейса, вы можете использовать следующий код:
import socket
import fcntl
import struct
def get_ip_address(ifname):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
return socket.inet_ntoa(fcntl.ioctl(
s.fileno(),
0x8915, # SIOCGIFADDR
struct.pack('256s', ifname[:15])
)[20:24])
print(get_ip_address('eth0')) # замените 'eth0' на имя вашего интерфейса
Использование curl
для внешнего IP
Если вам нужно узнать публичный IP-адрес, который видит интернет, вы можете использовать curl
:
curl ifconfig.me
Этот запрос вернет ваш публичный IP-адрес, определяемый внешним сервисом.
Заключение
В данной статье рассматривались различные способы получения IP-адреса на сервере Ubuntu без использования ifconfig
или ip
. Например, использование команды hostname
, Python с библиотеками netifaces
и socket
, а также curl
для получения публичного IP. Если у вас нет доступа к привилегированным командам или установке пакетов, эти обходные пути помогут вам получить необходимую информацию.
Эти методы могут быть полезными как для системных администраторов, так и для обычных пользователей, обеспечивая гибкость в управлении сетевыми настройками и подключениями.