本地主機的 IP
Linux 實例如何確定其 IP 地址?
也就是說,不是 127.0.0.1。
這是儲存在文件中還是 ifconfig 在每次呼叫時都會以某種方式計算它?
我設法解決它只是為了表明我付出了努力,但這並不是我在嚴肅的應用程序中投入的任何東西:
sudo ifconfig | head -n 2 | tail -n 1 | tr -s " " | tr " " ":" | cut -d":" -f 4
資訊可以隨時更改,因此需要從核心中檢索,不能儲存在文件中。
沒有真正好的方法來獲取這些資訊。您的解析與任何解析一樣好,除了硬編碼第二行是錯誤的:無法保證介面將以任何特定順序列出。一台機器有多個介面是相當普遍的:您可能有多個網卡或虛擬介面。
通常,您感興趣的 IP 地址與預設路由相關聯。對於大多數配置,您可以使用
route
命令獲取正確的介面,然後使用 .提取該介面的 IP 地址ifconfig
。/sbin/ifconfig $(/sbin/route -n | awk '$1 == "0.0.0.0" {print $8}') | awk 'match($0, /inet addr:[.0-9]+/) {print substr($0, RSTART+10, RLENGTH-10)}'
請注意,無需呼叫
sudo
.ifconfig
並且route
通常不是PATH
非 root 使用者的預設設置,但您可以在沒有特殊權限的情況下使用它們,只要您只是閱讀資訊而不更改設置。在 Linux 以外的 unix 變體上,您可能需要調整上述命令。大多數都有名為
ifconfig
and的命令route
,但輸出格式可能不同。在 Linux 下,您可以使用iproute2工具套件中的命令來代替
ifconfig
and 。雖然iproute2的作者考慮並被棄用,但實際上使用.route``ip``ifconfig``route``ip``ip``ifconfig``route``ip
你的問題有一個根本性的缺陷。首先,主機可能(並且很可能會)有不止一個地址(例如,多個介面),甚至每個介面有不止一個地址。這對於 IPv6 來說更是一個問題,其中每個全球連接的主機都至少有兩個地址。
其次,從外殼執行此操作的“最佳”方式因係統而異。
Linux:
/sbin/ip addr show eth0 | awk -F"[ /]+" '/inet / {print $3}'
= Solaris 11:
ipadm show-addr net0/v4 | awk -F"[ /]+" '/ok/ {print $5}'
Mac OS X/達爾文:
ipconfig getifaddr en0
即使是最小公分母和使用
ifconfig
也不會一致,因為輸出格式可能會改變。但是,要清理您的範例,請使用以下命令:ifconfig eth0 | awk -F"[ :]+" '/inet / {print $4}'
如果您使用 perl、ruby、java 等更高級的語言而不是 shell,則每種語言都有自己的方式從核心獲取這些數據。我會留給你找到這個。