Как узнать IP-адрес без команды ifconfig или ip в Ubuntu?

Вопрос или проблема

Сегодня я получил новый сервер 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 (что вероятно, так как он входит в стандартный дистрибутив), вы можете воспользоваться следующим подходом:

  1. Использование библиотеки 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
  1. Использование сокетов и библиотеки 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. Если у вас нет доступа к привилегированным командам или установке пакетов, эти обходные пути помогут вам получить необходимую информацию.

Эти методы могут быть полезными как для системных администраторов, так и для обычных пользователей, обеспечивая гибкость в управлении сетевыми настройками и подключениями.

Оцените материал
Добавить комментарий

Капча загружается...