2011-04-05 126 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