2011-04-05 89 views
3

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

我怀疑对于计算机来说,与外部IP和内部IP没有区别,因此没有100%的保证获得正确IP的方式。

最终的结果是,该脚本将返回内部IP,不管它是一个192个地址或204个地址等提前

感谢。

+0

你所说的“内部IP”是什么意思? – MattH 2011-04-05 10:27:35

+0

正如Intuited在下面提到的,问题确实应该是如何在与同一网络上的其他服务器通信时找到服务器正在使用的IP地址。通常服务器会有两个IP,一个用于在网络外部进行通信,另一个用于本地通信。但情况并非总是如此。找到本地通信时服务器使用的IP是我真正需要的。感谢所有伟大的建议和澄清。 – DrewVS 2011-04-07 16:30:26

回答

8

hostname -i”应该有希望给你同样的结果

0

虽然系统也可以有多个私有IP地址。您将不得不将IP上的搜索限制为私有IP。 10.0.0.0/8,172.16.0.0/12和192.168.0.0/16。

0

RFC 1918私有地址空间,一台机器可以想见,有10/8范围内的每个地址,172.16/12范围,192.168/16范围,共计17891328个IP地址,并所有的人都会合法的“内部”IP。

哦,是的,别忘了IPv6 :) 2^64可能的地址每个网络为一台机器,它可能参与多个网络。

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

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]' 

更庆典-Y的解决方案可能会使用tracepath或一些类似的工具。

+0

你提出一个很好的观点,谢谢。我应该说我的问题是,如何查找服务器在内部网络上通信时使用的IP地址。我会尝试将Python解决方案修改为BASH。 – DrewVS 2011-04-07 16:27:32

+0

@DrewVS:在这种情况下,您应该能够通过使用内部网络上的主机名称而不是“google.com”来获取它。我想这已经意识到了。 – intuited 2011-04-07 16:56:21