Linux 如何查找网络接口名称
我有一个bash脚本,可以在各种不同的Ubuntu Linux机器上运行。它的工作是找出本地主机的局域网IPv4地址 脚本正在使用Linux 如何查找网络接口名称,linux,bash,sed,ip,Linux,Bash,Sed,Ip,我有一个bash脚本,可以在各种不同的Ubuntu Linux机器上运行。它的工作是找出本地主机的局域网IPv4地址 脚本正在使用 ip addr show eth0 | sed -n '/inet /{s/^.*inet \([0-9.]\+\).*$/\1/;p}' 这很好,但是有些机器出于某种原因使用eth1而不是eth0。我希望能够发现LAN iface名称,因此我可以在此处替换它,而不是eth0 当然,如果你能想出一个不同的oneliner来做同样的事情,那就好了。我仍然想知道是否有
ip addr show eth0 | sed -n '/inet /{s/^.*inet \([0-9.]\+\).*$/\1/;p}'
这很好,但是有些机器出于某种原因使用eth1而不是eth0。我希望能够发现LAN iface名称,因此我可以在此处替换它,而不是eth0
当然,如果你能想出一个不同的oneliner来做同样的事情,那就好了。我仍然想知道是否有更简单的方法来做这件事,但这是我的解决办法:我知道LAN子网,所以
ip addr show | grep "inet 10.67.5." \
| sed -n '/inet /{s/^.*inet \([0-9.]\+\).*$/\1/;p}'
搜索字符串
inet
和brd
(用于广播)怎么样?这将给你:
ip addr show|egrep '^ *inet'|grep brd|awk -- '{ print $2; }'|sed -e 's:/[0-9]*$::'
注意,我使用的命令比需要的多;您可能可以使用sed
和更复杂的regexp实现同样的效果,但我更喜欢使用一个命令,它可以清楚地显示我通过哪些步骤获得结果
如果您想在单个命令中运行它,我建议尝试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) 这一个只打印接口名称(我需要它来处理即将到来和即将到来的PPP链接):
结果:
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
信不信由你,没有标准、简单的方法来获取这些信息。没有标准给我当前的IP和接口名命令。对于
ifconfig
返回的信息,甚至没有标准格式
我打算建议放弃纯shell,使用Python这样的脚本语言,您可以这样做:
import socket
socket.gethostbyname(socket.gethostname())
但它在大多数Linux系统上不起作用,因为/etc/host
文件中通常有一个条目指向环回地址127.0.0.1
。也有同样的问题
您已经牢牢掌握了所涉及的脚本,并且已经看到了问题所在。我唯一能推荐的就是在你要运行它的每台机器上测试一下,看看会出现什么。由于网络的设置方式以及每个位置对接口的命名方式,不会有一个通用的一行程序可用于所有操作系统,甚至不能用于同一操作系统上的不同系统。不确定这是否有帮助,但似乎
iprouteget
将显示它用于连接远程主机的接口
ubuntu@ip-10-40-24-21:/nail/srv/elasticsearch$ ip route get 8.8.8.8
8.8.8.8 via <gateway address> dev eth0 src <eth0 IP Address>
最新的systemd/udev已经自动开始为所有本地以太网、WLAN和WWAN接口分配接口名,这是我们大家都熟悉的。这与传统的接口命名方案(“eth0”、“eth1”、“wlan0”等)不同。。现在我们必须先检查本地接口名是什么,然后才能使用它,而之前我们非常准确地猜测“eth0”是正确的名称。你要的是网络名。。这里有一个小脚本来解决这个问题
主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上不起作用。您可能应该使用SNMP,而不是scripting@Flexo啊,我只关心ipv4局域网。已澄清问题。ip l | grep | awk{print$NF}显示最活跃的以太网接口:
arp-n-H ether | perl-ne'print$1 if/(\S+\n)$/'| sort | uniq-c | grep-v Iface | sort-n | tail-1 | perl-pe'S/*/*/'
如果没有DNS或主机名的/etc hosts
条目,它也不会工作。我发现ip命令输出两行(“缓存和ipid 0x2e6e”在第二行)。所以iproute get 8.8.8.8 | head-n1 | awk--“{print$7}”
适合我!在我的Ubuntu15.10机器上,似乎显示的是IP地址而不是接口名@user150471下面的答案很有效:ip路由获取8.8.8.8 | sed-nr的/*dev([^\]+)./\1/p'
非常好!我喜欢这个答案,因为它在不同情况下的多功能性。人们真正需要知道的是目的地的Ip地址<代码>ip路由
从此处开始。
ip -o -4 route show to default | awk '{print $5}'
ip -o -4 route show to default | awk '{print $3}'