Назад | Перейти на главную страницу

Портативный способ получить список всех активных сетевых интерфейсов

Я хочу получить список всех активных сетевых интерфейсов (например, eth0, wlan0). Я предполагаю, что мне придется проанализировать вывод ifconfig, но форматирование в разных ОС отличается. Есть ли у кого-нибудь переносимый способ получить эту информацию, чтобы ее можно было использовать в большинстве юниксов (linux, * bsd, mac).

Проверьте фасад пакет. Он используется в основном программой управления конфигурацией марионетки для получения метаданных с установленных машин, но для аналогичных целей его можно запускать автономно. Его выходные данные включают информацию о сетевых интерфейсах, обнаруженных на машине, и его форматирование будет одинаковым для разных платформ.

Пример вывода:

user@host:~$ facter
architecture => i386
domain => members.linode.com
facterversion => 1.3.8
fqdn => host.members.linode.com
hardwareisa => unknown
hardwaremodel => i686
hostname => host 
id => user 
ipaddress => 1.2.3.4 
ipaddress_eth0 => 1.2.3.4 
kernel => Linux
kernelrelease => 2.6.32.16-linode28
lsbdistcodename => hardy
lsbdistdescription => Ubuntu 8.04.4 LTS
lsbdistid => Ubuntu
lsbdistrelease => 8.04
macaddress => 76:c9:3e:0b:xx:xx
macaddress_eth0 => fe:fd:43:12:xx:xx
memoryfree => 393.08 MB
memorysize => 498.68 MB
operatingsystem => Debian
operatingsystemrelease => 2.6.32.16-linode28
processor0 => Intel(R) Xeon(R) CPU           L5335  @ 2.00GHz
processor1 => Intel(R) Xeon(R) CPU           L5335  @ 2.00GHz
processor2 => Intel(R) Xeon(R) CPU           L5335  @ 2.00GHz
processor3 => Intel(R) Xeon(R) CPU           L5335  @ 2.00GHz
processorcount => 4
ps => ps -ef
rubysitedir => /usr/local/lib/site_ruby/1.8
rubyversion => 1.8.6
swapfree => 186.84 MB
swapsize => 255.99 MB
uniqueid => 007f0101

Следующее будет возвращать список активных интерфейсов во всех распространенных дистрибутивах Linux:

ifconfig | grep "Link encap" | awk '{ print $1 '}

Если вы хотите также включить интерфейсы, которые в данный момент не работают (неактивны), просто добавьте флаг -a следующим образом:

ifconfig -a | grep "Link encap" | awk '{ print $1 '}

Насколько мне известно, не существует общего метода, который можно было бы использовать в любой системе POSIX для получения списка сетевых интерфейсов, поэтому вам придется локализовать свою команду для используемой в настоящее время ОС.

Не уверен в переносимости, потому что список сетевых интерфейсов может быть связан с реализацией ядра, а Linux вообще не имеет отношения к * bsd / mac ... однако, если ifconfig вам не подходит, вы можете попробовать netstat -i

Netstat -i и ifconfig покажут вам только текущие «активные» сетевые интерфейсы. Активный интерфейс также может не иметь носителя и, следовательно, быть непригодным для использования. Вам нужно искать флаг RUNNING (ifconfig) или флаг R (netstat -i). Этот флаг обозначает, что интерфейс имеет активную несущую или, как правило, что-то, к чему физически подключен сетевой интерфейс, например, коммутатор.