我的主要目标是找出 Linux 机器中有效接口的私有 IP 地址。
例如,我有 7 个接口,其中两个接口 docker0 的 IP 地址172.12.2.1
为eth0 172.23.32.201
在这两者中,我只需要172.23.32.201
一次。
我尝试了两种不同的方法来完成它:
1) I tried $(hostname -I | awk '{print $1}') but does it guarantees that i get the host instance IP.
2) ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'
This gives me all the ip address of every interface
有人能帮我解决这个问题吗?
答案1
你为什么不使用简单的ifconfig {interfacename}
?
为了仅获取 IP 地址,我会这样做:
ifconfig eth0 | grep inet | grep -v inet6 | awk '{ print $2 }'
答案2
我得到了答案:首先,获取机器的实际接口名称,然后过滤掉 ip
ifconfig $(route | grep '^default' | grep -o '[^ ]*$') | grep inet | grep -v inet6 | awk '{ print $2 }'
答案3
假设所需接口是主(最低度量)网关,请尝试:
ip address show "$(ip route | grep '^default' | head -n 1 | awk '{ print $5 }')" | grep inet | grep -v inet6 | awk -F" " '{ print $2 }' | cut -d/ -f1
这使用较新的接口命令“ip”(来自“iproute2”包),而不是较旧的“ifconfig”和“route”(来自“net-tools”包)。该命令可以缩短为仅使用“ip a show...”和“ip r...”,但为了清楚起见,我使用了完整的开关。使用 ifconfig/route:
ifconfig "$(route -n | grep '^0.0.0.0' | head -n 1 | awk '{ print $8 }')" | grep inet | grep -v inet6 | awk '{ print $2 }'
使用“route -n”来阻止解析主机名。