2010-10-22 5 views
1

Когда я попытался ifconfig, он дает мне всю информацию о сетевом адаптере.Как получить IP-адрес только одного интерфейса

Я пробовал:

system("ifconfig -a | grep inet | " 
      "sed 's/\\([ ]*[^ ]*\\)\\([ ]*[^ ]*\\).*$/\\1 \\2/' " 
      " > address.txt") ; 

которые выводят два IP-адреса:

inet addr:17.24.17.229 
    inet addr:127.0.0.1 

Но мне нужно только 1-ый, как я могу фильтровать это.

+0

Ум ... Я уверен, что у C++ есть возможность получить только первую строку, не так ли? –

+0

@Pekka: Но это то, что ему действительно нужно? Что, если '127.0.0.1' приходит по какой-то причине? – ereOn

+0

Я не вижу никакой связи между этим соединением и C++. Я даже не вижу никакой связи между этим вопросом и разработкой программного обеспечения, это скорее вопрос сетевого администрирования. –

ответ

0

Не смотрите на все адаптеры, только те, которые вы хотите.

system("ifconfig -a eth0 | grep inet | " 
      "sed 's/\\([ ]*[^ ]*\\)\\([ ]*[^ ]*\\).*$/\\1 \\2/' " 
      " > address.txt") ; 
2

Вы можете использовать head но ...

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

Возможно, вы ищете тот, который подключен к шлюзу (или Интернету).

Насколько я знаю, порядок IP-адресов или интерфейсов не указан.

Что именно вы хотите достичь?

Если вы хотите знать, что интерфейс «подключен к Интернету», более надежный подход, чтобы найти интерфейс, который имеет маршрут по умолчанию (используя route), а затем использовать ifconfig <interface> непосредственно получить правильный IP-адрес ,

+0

однако, возможно, сложность этого утеряна для этого пользователя, поскольку я только заметил, что я спросил его то же самое в его [последнем вопросе] (http://stackoverflow.com/questions/3997428/how-can-i-get- the-ip-address-of-system) :) –

+0

@Pekka: Я тоже на самом деле;) – ereOn

+1

@Pekka: Отличная точка - попробовал скрипт OP, и вот и вот, loopback был на первой строке. Это не очень полезный интерфейс. Поэтому я сделал это, и появился интерфейс управления сетью. Не полезно. Далее, интерфейс моста для моих виртуальных машин. Ой-ой. Не было бы более полезно проверить вывод «route»? У него есть шлюз по умолчанию. – Piskvor

1

вы можете уменьшить использование grep и head

ifconfig -a | sed -nr -e '/inet\b/{s|^.*inet\s+addr:(.[^ \t]*).*|\1|;h}' -e '${x;p}' 
0

Я хотел бы использовать iproute2 «s ip:

ip -o addr show dev eth0 | while read IFNUM IFNAME ADDRTYPE ADDR REST; do [ "$ADDRTYPE" == "inet" ] && echo $ADDR; done 
9.87.65.43/21 

(не только потому, что это проще разобрать, но Также будут показаны, например, вторичные IP-адреса, которые ifconfig не могут.)

0

Если вывод ifconfig или ip когда-либо изменился, ваша программа сломается.

Почему бы не просто использовать SIOCGIFCONFioctl() и получить его непосредственно от источника?

ETA. Также небезопасно предполагать, что любая система будет иметь только один интерфейс обратной петли и только один Ethernet с одним адресом.

 Смежные вопросы

  • Нет связанных вопросов^_^