Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何查找网络接口名称_Linux_Bash_Sed_Ip - Fatal编程技术网

Linux 如何查找网络接口名称

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来做同样的事情,那就好了。我仍然想知道是否有

我有一个bash脚本,可以在各种不同的Ubuntu Linux机器上运行。它的工作是找出本地主机的局域网IPv4地址

脚本正在使用

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”是正确的名称。你要的是网络名。。这里有一个小脚本来解决这个问题

  • 使用“ip路由获取8.8.8.8”确定哪个活动接口具有到internet的路由(或当前正在使用) 输出应如下所示:

    8.8.4.4通过10.10.1.1 dev enp0s3 src 10.10.1.118 缓存

  • 使用awk打印接口名称的第5个文本块

    ]#ip路由获取8.8.8.8|awk--{print$5} 输出:enp0s3

  • 使用awk打印接口地址的第7个文本块

    ]#ip路由获取8.8.8.8|awk--{print$7} 输出:10.10.1.118


  • 主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}'