我有一个可以在各种不同的 Ubuntu Linux 机器上运行的 bash 脚本。它的工作是找出本地主机的 LAN IPv4 地址。
脚本正在使用
ip addr show eth0 | sed -n '/inet /{s/^.*inet \([0-9.]\+\).*$/\1/;p}'
这很好,但有些机器由于某种原因使用 eth1 而不是 eth0。我希望能够发现 LAN iface 名称,因此我可以在这里替换它而不是 eth0。
当然,如果你能想出一个不同的 oneliner 来做同样的事情,那就太好了。
主网卡通常会有默认路由。所以:
ip -o -4 route show to default
网卡:
ip -o -4 route show to default | awk '{print $5}'
网关:
ip -o -4 route show to default | awk '{print $3}'
与 ifconfig 不同,ip 具有一致且可解析的输出。它仅适用于Linux;它不适用于其他 Unixen。
不确定这是否有帮助,但似乎
ip route get
将显示它使用哪个接口连接到远程主机。
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>
当然你可以在 shell 脚本中使用类似的东西来自动化它,
ip route get 8.8.8.8 | awk '{ print $NF; exit }'
最近,systemd/udev 已自动开始为所有本地以太网、WLAN 和 WWAN 接口分配接口名称,这是我们都习惯的。这与传统的接口命名方案(“eth0”、“eth1”、“wlan0”等)不同。现在我们必须先检查本地接口名称是什么,然后才能使用它,而之前我们是这样的非常准确地猜测“eth0”是正确的名称。您要求的是网络名称..这是一个解决问题的小脚本
使用“ip route get 8.8.8.8”找出哪个活动接口具有到互联网的路由(或当前正在使用) 输出应如下所示:
8.8.4.4 通过 10.10.1.1 dev enp0s3 src 10.10.1.118 缓存
使用 awk 打印 Interface NAME 的第 5 个文本块
]# ip 路由获取 8.8.8.8 | awk -- '{打印 $5}' 输出:enp0s3
使用 awk 打印接口地址的第 7 个文本块
]# ip 路由获取 8.8.8.8 | awk -- '{打印 $7}' 输出:10.10.1.118
搜索字符串
inet
和 brd
(用于广播)怎么样?那会给你:
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 }'
不管你信不信,没有标准的、简单的方法来获取这些信息。没有标准的“给我当前的 IP 和接口名称”命令。 ifconfig
返回的信息甚至没有标准格式。
import socket
socket.gethostbyname(socket.gethostname())
但它在大多数 Linux 系统上不起作用,因为
/etc/host
文件中通常有一个条目指向
127.0.0.1
(环回地址)。 Perl也有同样的问题。 您牢牢掌握了所涉及的脚本,并且您已经看到了问题。我唯一可以推荐的就是在每台要运行它的机器上测试它,看看会弹出什么结果。由于网络的设置方式以及每个位置可能命名接口的方式,不会有一种适用于所有操作系统的通用单线,甚至不会适用于同一操作系统上的不同系统。
ip addr show | grep "inet 10.67.5." \
| sed -n '/inet /{s/^.*inet \([0-9.]\+\).*$/\1/;p}'
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