使用BASH查找内部IP地址

时间:2011-04-05 06:26:56

标签: bash networking scripting ip tcp

我已经知道了许多获取内部IP的方法(ifconfig,ip addr,/ etc / hosts等),但我正在尝试编写一个始终返回内部IP的bash脚本。问题是,许多单行(/ sbin / ifconfig | grep inet | head -1 | sed's / \:/ /'| awk'{print $ 3}')可以返回多个IP,我需要区分内部一个手动。

我怀疑在计算机上,外部IP和内部IP之间没有区别,因此没有100%保证获得正确IP的方法。

最终结果是该脚本将返回内部IP,无论其是192地址还是204地址等。

提前致谢。

4 个答案:

答案 0 :(得分:8)

hostname -i”应该会给你相同的结果

答案 1 :(得分:5)

正如其他人所提到的,机器并没有真正保证,甚至可能只有一个IP地址。我不确定你所说的“内部知识产权”是什么意思;有时这可能意味着“本地网络上的IP地址”,即连接到启用NAT的防火墙的接口。

我认为最好的方法是连接到您想要的网络上的主机,并使用该连接所源自的地址。这将是机器通常用于连接到该网络的接口。用户Unkwntech对this thread有同样的想法。以下代码仅从该答案中获取。

我不知道这是否真的有资格作为“bash”解决方案,因为它只是一个内联Python脚本,但无论如何这将获得用于访问 google.com 的本地IP地址。因此,这将为您提供机器用于访问Internet主机的任何接口的IP地址。

$ python -c 'import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("google.com", 80))
print s.getsockname()[0]'

更多bash-y解决方案可能会使用tracepath或类似的实用程序。

答案 2 :(得分:0)

系统也可以拥有多个私有IP。您必须将对IP的搜索限制为私有IP。 10.0.0.0/8,172.16.0.0/12和192.168.0.0/16。

答案 3 :(得分:0)

RFC 1918个私人地址空间内,一台机器可能会在10/8范围,172.16/12范围和{{1}中拥有每个地址范围,总共17891328个IP地址,所有它们将是合法的“内部”IP。

哦,是的,不要忘记IPv6 :) 2 ^ 64个可能的地址每个网络一台机器,可能参与多个网络。

这也不完全是学术性的:VMWare,VirtualBox,QEMU等主机系统分配多个RFC 1918地址是很常见的。一个用于“通常使用”,另一个用于与客户操作系统通信。或路由器/防火墙,出于访问控制的原因,它们可能有十几个内部IP专门用于网络子网。