Получение действительного ip-адреса по имени интерфейса

Модератор: Модераторы разделов

Ответить
Аватара пользователя
minoru-kun
Сообщения: 620
ОС: Debian GNU/Linux

Получение действительного ip-адреса по имени интерфейса

Сообщение minoru-kun »

Недавно, столкнулся с необходимостью написания утилиты, способной выводить действующий ip-адрес по имени ethernet-интерфейса. К сожалению, я столкнулся с полным незнанием вызовов ядра и Linux API. Я пытался проанализировать исходные тексты net-tools, чтобы понять, как это можно сделать но, в следствии объема и "завязанности" кода, а так же собственной неопытности, мои усилия были тщетны... Кроме того, может, уже существует какая-нибудь утилита, позволяющая выполнить данную задачу, и выводящая результат в формате, пригодном для непосредственного использования без распарсивания (или - с минимальным распарсиванием не более 1 строки)? Ifconfig по этим критериям явно не подходит...
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Контактная информация:

Re: Получение действительного ip-адреса по имени интерфейса

Сообщение sash-kan »

minoru-kun писал(а):
14.01.2008 22:31
Ifconfig по этим критериям явно не подходит
ifconfig не подходит по другому, очень существенному критерию — он не в состоянии отобразить более одного адреса, присвоенного сетевому устройству.
кстати, по этому поводу некорректна и формулировка — «действующий ip-адрес по имени ethernet-интерфейса». их (ip-адресов) может быть много. очень много. и все — «действующие».

для какого языка это дело нужно? если для C, то ковырять, видимо, надо в сторону man 7 netlink, man 7 rtntetlink.
что-то в этом духе.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Получение действительного ip-адреса по имени интерфейса

Сообщение Zeus »

sash-kan писал(а):
15.01.2008 20:22
minoru-kun писал(а):
14.01.2008 22:31
Ifconfig по этим критериям явно не подходит
ifconfig не подходит по другому, очень существенному критерию — он не в состоянии отобразить более одного адреса, присвоенного сетевому устройству.

Странно, у меня отображает.
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Контактная информация:

Re: Получение действительного ip-адреса по имени интерфейса

Сообщение sash-kan »

Zeus писал(а):
15.01.2008 21:18
Странно, у меня отображает.

$ sudo ip a a 172.16.0.1/24 dev eth0
$ ip a s eth0
$ sudo ifconfig eth0
$ sudo ip a d 172.16.0.1/24 dev eth0
?
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Получение действительного ip-адреса по имени интерфейса

Сообщение Zeus »

[root@zeus zeus]# /sbin/ifconfig
eth0 Link encap:Ethernet HWaddr 00:18:F3:CD:89:02
inet addr:192.168.1.1 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
Interrupt:17

eth0:1 Link encap:Ethernet HWaddr 00:18:F3:CD:89:02
inet addr:192.168.1.10 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST MULTICAST MTU:1500 Metric:1
Interrupt:17

eth1 Link encap:Ethernet HWaddr 00:18:F3:A9:99:F4
inet addr:192.168.0.83 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::218:f3ff:fea9:99f4/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:6873 errors:0 dropped:0 overruns:0 frame:0
TX packets:3034 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2624709 (2.5 MiB) TX bytes:652490 (637.1 KiB)
Interrupt:16

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:1159 errors:0 dropped:0 overruns:0 frame:0
TX packets:1159 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:2071101 (1.9 MiB) TX bytes:2071101 (1.9 MiB)

ppp0 Link encap:Point-to-Point Protocol
inet addr:10.12.0.85 P-t-P:10.0.0.1 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1472 Metric:1
RX packets:2709 errors:0 dropped:0 overruns:0 frame:0
TX packets:2752 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:2065768 (1.9 MiB) TX bytes:562742 (549.5 KiB)




Или не об этом речь?
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Контактная информация:

Re: Получение действительного ip-адреса по имени интерфейса

Сообщение sash-kan »

eth0:1 — речь не об этом.
результат выполнения приведенных мною команд:

Код: Выделить всё

~$ sudo ip a a 172.16.0.1/24 dev eth0
~$ ip a s eth0
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:c0:26:69:58:8c brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.2/24 brd 10.0.0.255 scope global eth0
    inet 172.16.0.1/24 scope global eth0
~$ sudo ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:C0:26:69:58:8C
          inet addr:10.0.0.2  Bcast:10.0.0.255  Mask:255.255.255.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
          Interrupt:5 Base address:0xe000
~$ sudo ifconfig -a
eth0      Link encap:Ethernet  HWaddr 00:C0:26:69:58:8C
          inet addr:10.0.0.2  Bcast:10.0.0.255  Mask:255.255.255.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
          Interrupt:5 Base address:0xe000

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:456 errors:0 dropped:0 overruns:0 frame:0
          TX packets:456 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:168969 (165.0 KiB)  TX bytes:168969 (165.0 KiB)

ppp0      Link encap:Point-to-Point Protocol
          inet addr:xx.xx.xx.xx  P-t-P:xx.xx.xx.xx  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:2902 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3104 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3
          RX bytes:1434894 (1.3 MiB)  TX bytes:590741 (576.8 KiB)
~$ sudo ip a d 172.16.0.1/24 dev eth0
~$
ifconfig -a — для полной иллюстрации.
почувствуйте разницую
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Получение действительного ip-адреса по имени интерфейса

Сообщение Zeus »

Я-таки не понимаю что не так в ifconfig'е...
ifconfig -a выдаёт как-раз то, что я показал.
И в этом выводе виден ещё один адрес присвоенный физической сетевушке, возможность чего отрицалась во втором сообщении темы.
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Контактная информация:

Re: Получение действительного ip-адреса по имени интерфейса

Сообщение sash-kan »

Zeus писал(а):
17.01.2008 01:06
Я-таки не понимаю что не так в ifconfig'е...
да все в нем так. вот только сетевая подсистема ядра под названием linux кардинально изменилась с версии 2.0.
и мухи отделены от котлет. т.е. адреса отделены от интерфейсов.
а ifconfig этого, к сожалению, не понимает.
by design, так сказать.
когда-то это всех устраивало. потом перестало. были выдуманы костыли под названием alias-ы (которые Вы и продемонстрировали). а потом сетевую подсистему переписали.

Вы все-таки выполните предложенные мной команды. и перед вводом последней (удаление адреса) убедитесь, что адрес, несмотря на то, что ifconfig его в упор не видит, все-таки за интерфейсом полноценно закреплен.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Получение действительного ip-адреса по имени интерфейса

Сообщение Zeus »

sash-kan писал(а):
17.01.2008 02:31
адреса отделены от интерфейсов.
а ifconfig этого, к сожалению, не понимает.
by design, так сказать.
когда-то это всех устраивало. потом перестало. были выдуманы костыли под названием alias-ы (которые Вы и продемонстрировали).

Так alias'ы что-ли не нравятся или что?

sash-kan писал(а):
17.01.2008 02:31
Вы все-таки выполните предложенные мной команды. и перед вводом последней (удаление адреса) убедитесь, что адрес, несмотря на то, что ifconfig его в упор не видит, все-таки за интерфейсом полноценно закреплен.

Выполнил я их, выполнил.
Ну показывают примерно то же - цифирки только другие.
Так это же и ifconfig'ом можно посмотреть - пусть он показывает дополнительные адреса, как alias'ы, а не так как ip.
Информацию же можно получить.
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Контактная информация:

Re: Получение действительного ip-адреса по имени интерфейса

Сообщение sash-kan »

Zeus писал(а):
17.01.2008 14:05
Информацию же можно получить.
мы как-то на разных языках, видимо, общаемся (:
я пишу «в упор не видит», Вы пишете «можно получить». нда.
ну ладно, замнем для ясности.
не в этом дело. не в том, что ifconfig, route и arp не соответсвуют текущим реалиям ядра под названием linux.

единственно, ради чего писАл в этой теме — это чтобы донести мысль о том, что «действующий ip-адрес по имени ethernet-интерфейса» для ядра под названием linux — нонсенс. лишено смысла. «действующих» адресов может быть закреплено за одним интерфейсом сколько угодно (предел, конечно, есть, но я не в курсе, каков он).

p.s. дабы прекратить дальнейшие прения, переадресовываю все вопросы по поводу «устаревших» программ к документации по iproute. прямо к первой странице. где-то я даже давал прямую ссылку.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Получение действительного ip-адреса по имени интерфейса

Сообщение Zeus »

sash-kan писал(а):
17.01.2008 22:51
мы как-то на разных языках, видимо, общаемся (:

Похоже на то.
Я так и не понял в чём проблема узнать ifconfig'ом какие IP-адреса подняты на каких сетевых интерфейсах, пусть даже их несколько.
:unsure:
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Контактная информация:

Re: Получение действительного ip-адреса по имени интерфейса

Сообщение sash-kan »

Zeus писал(а):
18.01.2008 00:29
Я так и не понял в чём проблема узнать ifconfig'ом какие IP-адреса подняты на каких сетевых интерфейсах, пусть даже их несколько.

$ sudo ip a a 172.16.0.1/24 dev eth0
$ ifconfig -a
?
видите адрес 172.16.0.1/24?
не видите.
это не проблема.
это просто устаревшая программа.
и менять логику ее работы, судя по всему, никто не собирается.

ifconfig показывает неправильную картину. и если Вас это устраивает, предлагаю дискуссию закрыть.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
gorilych
Сообщения: 14
ОС: Debian sid

Re: Получение действительного ip-адреса по имени интерфейса

Сообщение gorilych »

не всегда ifconfig показывает один адрес. иногда два:

# ifconfig eth0|grep addr:
inet addr:192.168.45.55 Bcast:192.168.45.63 Mask:255.255.255.224
inet6 addr: fe80::216:36ff:fe07:2d82/64 Scope:Link

:)
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Получение действительного ip-адреса по имени интерфейса

Сообщение Zeus »

sash-kan писал(а):
18.01.2008 03:08
$ sudo ip a a 172.16.0.1/24 dev eth0
$ ifconfig -a
?
видите адрес 172.16.0.1/24?
не видите.
это не проблема.
это просто устаревшая программа.
и менять логику ее работы, судя по всему, никто не собирается.

ifconfig показывает неправильную картину. и если Вас это устраивает, предлагаю дискуссию закрыть.

Попробовал. Понял в чём дело.

Ну так если только ifconfig'ом пользоваться (с его alias'ами) - и поднимать адреса и смотреть, то всё видно.
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Контактная информация:

Re: Получение действительного ip-адреса по имени интерфейса

Сообщение sash-kan »

gorilych писал(а):
18.01.2008 06:28
иногда два
да, в случае ipv6, видимо, решили не сохранять backwards compatibility.
Zeus писал(а):
18.01.2008 10:46
Ну так если только ifconfig'ом пользоваться
и если только на машине, где Вы — сам себе велосипед.

p.s. осебенно меня лично умиляет, когда на форуме, при разборе проблем с сетью, просят выложить ifconfig -a.
ага.

p.p.s. кстати, выложу прямые ссылки.
http://lartc.org/howto/lartc.iproute2.html...TC.IPROUTE2.WHY
Most Linux distributions, and most UNIX's, currently use the venerable arp, ifconfig and route commands. While these tools work, they show some unexpected behaviour under Linux 2.2 and up.

http://gazette.linux.ru.net/rus/articles/lartc/c177.html
Большинство дистрибутивов Linux, как и большинство ОС UNIX, в настоящее время используют довольно древние утилиты arp, ifconfig и route. Пока что эти инструменты работают достаточно адекватно, но иногда, на ядрах Linux версии 2.2 и выше, они могут вести себя довольно неожиданно.

кстати, все-таки, с версии 2.2, а не 2.0. вечно путаю ):

p.p.p.s. не надо меня спрашивать, в чем еще эти команды могут «show some unexpected behaviour». не знаю, не вникал.
мне лично достаточно двух вещей — вышеописанного поведения ifconfig-а и более логичного (и даже реентерабельного) вывода ip r. под «реентерабельностью» подразумеваю то, что (почти) любую строку, выдаваемую ip r, можно передать той же команде параметром:
ip r [a|d] <строка из вывода ip r>
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
gorilych
Сообщения: 14
ОС: Debian sid

Re: Получение действительного ip-адреса по имени интерфейса

Сообщение gorilych »

спасибо sash-kan за наше счастливое детство.

то есть, тьфу, за просвещение. А то вот работаю в этой области уже пару лет, а о том, что ifconfig устарел, первый раз слышу.

И за ссылки отдельное спасибо, а то не man ip не man ifconfig об этом явно не говорят, и в сети найти на эту тему ничего не смог. В исходниках шариться побоялся.
Спасибо сказали:
Ответить