Как я могу получить IP только одного интерфейса - PullRequest
1 голос
/ 22 октября 2010

Когда я попробовал ifconfig, он дает мне всю информацию о сетевом адаптере.

Я пытался:

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

, которые выводят два Ips:

  inet  addr:17.24.17.229
  inet  addr:127.0.0.1

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

Ответы [ 6 ]

2 голосов
/ 22 октября 2010

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

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

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

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

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

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

1 голос
/ 22 октября 2010

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

ifconfig -a | sed -nr -e '/inet\b/{s|^.*inet\s+addr:(.[^ \t]*).*|\1|;h}' -e '${x;p}'
0 голосов
/ 22 октября 2010

Как насчет 'ifconfig eth0'?

0 голосов
/ 22 октября 2010

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

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

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

0 голосов
/ 22 октября 2010

Я бы использовал 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 голосов
/ 22 октября 2010

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

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