2012-09-18 105 views
4

我有一个在各种不同的Ubuntu Linux机器上运行的bash脚本。它的工作是找出本地主机的局域网IPv4地址。如何查找网络接口名称

脚本使用

ip addr show eth0 | sed -n '/inet /{s/^.*inet \([0-9.]\+\).*$/\1/;p}' 

这是很好的,但有些机器出于某种原因使用的eth1的,而不是eth0。我想能够发现LAN的iface名称,所以我可以在这里替代它而不是eth0。

当然,如果你能想出一个不同的线索,做同样的事情,一切都很好。

+0

你应该可以使用SNMP来代替脚本 –

+0

@Flexo啊,我只关心ipv4局域网。澄清了问题。 – artfulrobot

回答

10

不知道这是否有帮助,但似乎ip route get将显示它用于连接到远程主机的接口。

[email protected]:/nail/srv/elasticsearch$ ip route get 8.8.8.8 
8.8.8.8 via <gateway address> dev eth0 src <eth0 IP Address> 
当然

,你可以用类似的自动化,在shell脚本,

ip route get 8.8.8.8 | awk '{ print $NF; exit }' 
+0

做得非常简洁可靠的解决方案。谢谢! – artfulrobot

+0

它似乎在我的Ubuntu 15.10机器上显示IP地址而不是接口名称。 @ user150471的答案如下:http://stackoverflow.com/a/30201105/1069083 – rubo77

+0

'ip route get 8.8.8.8 | sed -nr's /.* dev([^ \] +)。*/\ 1/p'' – h0tw1r3

1

我还是想知道如果有办法做到这一点更简单的方法,但是这是我的解决方法:我知道在局域网子网,所以......

ip addr show | grep "inet 10.67.5." \ 
    | sed -n '/inet /{s/^.*inet \([0-9.]\+\).*$/\1/;p}' 
2

如何搜索的字符串inetbrd(用于广播)?这会给你:

ip addr show|egrep '^ *inet'|grep brd|awk -- '{ print $2; }'|sed -e 's:/[0-9]*$::' 

请注意,我使用更多的命令,而不是必要的;你可以使用sed和更复杂的正则表达式来达到同样的效果,但我更喜欢一个命令,通过我得出结果的步骤来明确它。

如果你想在一个单一的命令来运行它,我建议尝试awk

ip addr show|awk -- '$1 == "inet" && $3 == "brd" { split($2,a,"/"); print a[1]; }' 

这是不是比sed版本更长的时间,但更具可读性。

+1稍微更具可读性:

ip addr show | awk '$1 == "inet" && $3 == "brd" { sub (/\/.*/,""); print $2 }' 
1

1)这一次只打印接口名称(我需要,对于即将到来的移交和downcoming PPP链路):

for i in $(ifconfig | grep 'ppp' | awk '{print $1}'); 
do 

printf "$i "; ## Or echo 

done 

结果:

ppp0的PPP1 ppp2

2)该一个打印接口名和IP

declare -a IPADDR 

index=0 

for i in $(ifconfig | grep 'inet addr' | awk '{print $2}'| sed 's#addr:##g'); 
do 
     IPADDR[$index]=$i 
     let "index += 1" 
done 

index=0 

for i in $(ifconfig | grep 'ppp' | awk '{print $1}'); 
do 
     echo $i 
     let "index += 1" 
done 

结果:

ppp0的地址:IP

PPP1地址:IP

ppp2地址:IP

2

信不信由你,没有标准的,简单的方法来获取这些信息。目前没有标准给我的当前IP和接口名称的命令。 ifconfig返回的信息甚至没有标准格式。

我会建议放弃纯粹的外壳,并用脚本语言如Python在那里你可以做到这一点去:

import socket 
socket.gethostbyname(socket.gethostname()) 

除了它没有在大多数Linux系统上工作,因为有通常在一个条目/etc/host文件指向127.0.0.1,环回地址。 Perl具有相同的问题。

你对所涉及的脚本有着坚定的把握,并且你已经看到了这些问题。我可以推荐的唯一方法就是在每台要运行它的机器上测试它,然后看看弹出的内容。由于网络的设置方式以及每个位置的接口名称可能不同,所以不会出现适用于所有操作系统,甚至是同一操作系统上的不同系统的通用目的。

+0

当主机名没有DNS或'/ etc/hosts'项时,它也不起作用。 – gatoatigrado

1

大多数recenttly systemd/udev已经自动开始分配接口名称为所有本地以太网,WLAN和WWAN接口的东西我们都习惯于。这与传统的接口命名方案(“eth0”,“eth1”,“wlan0”,...)有所不同。现在我们必须首先检查本地接口名称是什么,然后才能使用它,而之前我们是一个非常准确的猜测,“eth0”是正确的名字。什么你问的是网络名称。这里是一个小的脚本来解决这个问题

  1. 使用“IP路由得到8.8.8.8”找出哪些活动接口具有互联网路由(或当前正在使用) 输出应该是这样的:

    通过10.10.1.1开发enp0s3 SRC 10.10.1.118 缓存

  2. 用awk打印的接口名称第五文本块8.8.4.4

    ]#ip route get 8.8.8.8 | AWK - '{打印$ 5}' 输出:enp0s3

  3. 用awk打印的接口第七届文本块地址

    ]#IP路由得到8.8.8.8 | AWK - '{打印$ 7}' 输出:10.10.1.118

+0

很好的答案。我发现ip命令输出两行(第二行中的“cache和ipid 0x2e6e”)。所以'ip route get 8.8.8.8 |头-n1 | awk - '{print $ 7}''适合我! – artfulrobot

3

主要NIC通常有一个默认路由。所以:

ip -o -4 route show to default 

的NIC:

ip -o -4 route show to default | awk '{print $5}' 

网关:

ip -o -4 route show to default | awk '{print $3}' 

不同的ifconfig,IP具有一致&分析输出。它只适用于Linux;它不会在其他Unixen上运行。