Skip to content

Неверное определение IP-адреса при совпадении части имени интерфейса #306

@AntonNeutron

Description

@AntonNeutron

get_ip_by_inface() {

Функция: get_ip_by_inface()

Описание проблемы:
Функция определяет IP-адрес интерфейса с помощью команды:

/opt/sbin/ip a | grep global | grep "${entware_inf}" | sed 's/.*inet.\(.*\)\/.*/\1/'
или в новой версии
/opt/sbin/ip a | grep -F "${net_interface}" | grep -F 'global' | grep -oE "inet ${IP_FILTER}" | cut -d' ' -f2

Это приводит к ошибочному результату, если существует два интерфейса с пересекающимися именами, например nwg0 и wg0. При поиске "wg0" grep возвращает обе строки, так как nwg0 также содержит wg0, и IP-адрес может продублироваться.

Пример результата:
inet 10.8.1.2/32 scope global nwg0
inet 10.8.1.2/32 scope global wg0

Результат функции:
10.8.1.2
10.8.1.2

Ожидаемое поведение:
Функция должна возвращать IP только точного интерфейса, например только wg0.

варианты

это для 1.1.8-2

get_ip_by_inface() {
    entware_inf="${1}"
    /opt/sbin/ip -4 a show "${entware_inf}" 2>/dev/null | awk '$1 == "inet" {print $2}' | cut -d'/' -f1 | head -n1
}

Этот вариант:

  • не ловит мусор,
  • строго смотрит только на inet,
  • работает даже если интерфейс не существует (не будет ошибки, а просто пустой вывод),
  • берёт только первый IP, если их несколько.

так же можно посмотреть
/opt/sbin/ip -4 -o addr show dev "${net_interface}" scope global | awk '{print $4}' | cut -d/ -f1 | head -n1

но Вы смотрите сами, это просто для заметки


"device": Keenetic Giga II
"release": "2.16.D.12.0-8",
"arch": "mips", (странно entware грузит mipsel)
BusyBox v1.36.1 (2024-03-19 14:07:09 UTC)
Версия пакета 1.1.8 release-2

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions