Получение действительного ip-адреса по имени интерфейса
Модератор: Модераторы разделов
- minoru-kun
- Сообщения: 620
- ОС: Debian GNU/Linux
Получение действительного ip-адреса по имени интерфейса
Недавно, столкнулся с необходимостью написания утилиты, способной выводить действующий ip-адрес по имени ethernet-интерфейса. К сожалению, я столкнулся с полным незнанием вызовов ядра и Linux API. Я пытался проанализировать исходные тексты net-tools, чтобы понять, как это можно сделать но, в следствии объема и "завязанности" кода, а так же собственной неопытности, мои усилия были тщетны... Кроме того, может, уже существует какая-нибудь утилита, позволяющая выполнить данную задачу, и выводящая результат в формате, пригодном для непосредственного использования без распарсивания (или - с минимальным распарсиванием не более 1 строки)? Ifconfig по этим критериям явно не подходит...
Re: Получение действительного ip-адреса по имени интерфейса
ifconfig не подходит по другому, очень существенному критерию — он не в состоянии отобразить более одного адреса, присвоенного сетевому устройству.
кстати, по этому поводу некорректна и формулировка — «действующий ip-адрес по имени ethernet-интерфейса». их (ip-адресов) может быть много. очень много. и все — «действующие».
для какого языка это дело нужно? если для C, то ковырять, видимо, надо в сторону man 7 netlink, man 7 rtntetlink.
что-то в этом духе.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
при сбоях форума см.блог
Re: Получение действительного ip-адреса по имени интерфейса
Re: Получение действительного ip-адреса по имени интерфейса
$ 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
при сбоях форума см.блог
при сбоях форума см.блог
Re: Получение действительного ip-адреса по имени интерфейса
[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)
Или не об этом речь?
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)
Или не об этом речь?
Re: Получение действительного ip-адреса по имени интерфейса
eth0:1 — речь не об этом.
результат выполнения приведенных мною команд:
ifconfig -a — для полной иллюстрации.
почувствуйте разницую
результат выполнения приведенных мною команд:
Код: Выделить всё
~$ 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
~$
почувствуйте разницую
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
при сбоях форума см.блог
Re: Получение действительного ip-адреса по имени интерфейса
Я-таки не понимаю что не так в ifconfig'е...
ifconfig -a выдаёт как-раз то, что я показал.
И в этом выводе виден ещё один адрес присвоенный физической сетевушке, возможность чего отрицалась во втором сообщении темы.
ifconfig -a выдаёт как-раз то, что я показал.
И в этом выводе виден ещё один адрес присвоенный физической сетевушке, возможность чего отрицалась во втором сообщении темы.
Re: Получение действительного ip-адреса по имени интерфейса
да все в нем так. вот только сетевая подсистема ядра под названием linux кардинально изменилась с версии 2.0.
и мухи отделены от котлет. т.е. адреса отделены от интерфейсов.
а ifconfig этого, к сожалению, не понимает.
by design, так сказать.
когда-то это всех устраивало. потом перестало. были выдуманы костыли под названием alias-ы (которые Вы и продемонстрировали). а потом сетевую подсистему переписали.
Вы все-таки выполните предложенные мной команды. и перед вводом последней (удаление адреса) убедитесь, что адрес, несмотря на то, что ifconfig его в упор не видит, все-таки за интерфейсом полноценно закреплен.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
при сбоях форума см.блог
Re: Получение действительного ip-адреса по имени интерфейса
Так alias'ы что-ли не нравятся или что?
Выполнил я их, выполнил.
Ну показывают примерно то же - цифирки только другие.
Так это же и ifconfig'ом можно посмотреть - пусть он показывает дополнительные адреса, как alias'ы, а не так как ip.
Информацию же можно получить.
Re: Получение действительного ip-адреса по имени интерфейса
мы как-то на разных языках, видимо, общаемся (:
я пишу «в упор не видит», Вы пишете «можно получить». нда.
ну ладно, замнем для ясности.
не в этом дело. не в том, что ifconfig, route и arp не соответсвуют текущим реалиям ядра под названием linux.
единственно, ради чего писАл в этой теме — это чтобы донести мысль о том, что «действующий ip-адрес по имени ethernet-интерфейса» для ядра под названием linux — нонсенс. лишено смысла. «действующих» адресов может быть закреплено за одним интерфейсом сколько угодно (предел, конечно, есть, но я не в курсе, каков он).
p.s. дабы прекратить дальнейшие прения, переадресовываю все вопросы по поводу «устаревших» программ к документации по iproute. прямо к первой странице. где-то я даже давал прямую ссылку.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
при сбоях форума см.блог
Re: Получение действительного ip-адреса по имени интерфейса
$ sudo ip a a 172.16.0.1/24 dev eth0
$ ifconfig -a
?
видите адрес 172.16.0.1/24?
не видите.
это не проблема.
это просто устаревшая программа.
и менять логику ее работы, судя по всему, никто не собирается.
ifconfig показывает неправильную картину. и если Вас это устраивает, предлагаю дискуссию закрыть.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
при сбоях форума см.блог
Re: Получение действительного ip-адреса по имени интерфейса
не всегда 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
# 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
Re: Получение действительного ip-адреса по имени интерфейса
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'ами) - и поднимать адреса и смотреть, то всё видно.
Re: Получение действительного ip-адреса по имени интерфейса
да, в случае ipv6, видимо, решили не сохранять backwards compatibility.
и если только на машине, где Вы — сам себе велосипед.
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
при сбоях форума см.блог
при сбоях форума см.блог
Re: Получение действительного ip-адреса по имени интерфейса
спасибо sash-kan за наше счастливое детство.
то есть, тьфу, за просвещение. А то вот работаю в этой области уже пару лет, а о том, что ifconfig устарел, первый раз слышу.
И за ссылки отдельное спасибо, а то не man ip не man ifconfig об этом явно не говорят, и в сети найти на эту тему ничего не смог. В исходниках шариться побоялся.
то есть, тьфу, за просвещение. А то вот работаю в этой области уже пару лет, а о том, что ifconfig устарел, первый раз слышу.
И за ссылки отдельное спасибо, а то не man ip не man ifconfig об этом явно не говорят, и в сети найти на эту тему ничего не смог. В исходниках шариться побоялся.