我正在編寫一個程序,需要知道系統當前的 IPv4 位址(透過 DHCP 接收)(如果已連接並且有的話)。為了方便討論,語言無關緊要,我必須從磁碟上的檔案中讀取。是否有這樣一個檔案始終儲存目前的 IPv4 位址?
答案1
有一個檔案/proc/net/tcp
以小端四位元組十六進位數字格式儲存 IP 位址。然而,這假設會話已開啟以查找 IP 位址。除此之外,您ip addr show
也可以使用指令。
您需要反轉字串才能取得 IP 位址。參考這回答如何從文件中獲取輸出/proc/net/tcp
。
答案2
磁碟上沒有任何檔案可以保證包含目前的 IP 位址。如果您透過 DHCP 取得 IP 位址,DHCP 可能會將位址寫入某處,但沒有標準位置。
取得目前 IP 位址的正常、可移植方法是解析ifconfig
or 的輸出(僅限 Linux)ip addr show
。請注意,除了主要 Internet 連接的位址之外,還有環回位址 127.0.0.1,通常還有更多位址(用於內部網路、虛擬機器等)。一個好的提示是檢索提供第一個預設路由的介面的位址。
default_interface=$(route -n | awk '$1 == "0.0.0.0" {print $8; exit}')
ip_address=$(ifconfig "$default_interface" | awk 'sub(/.* inet addr:/, "") {print $1}')
答案3
我查看了 Linux Mint /var/lib/dhcp/
(基於 Ubuntu 14.04)的資料夾,那裡唯一的檔案是空的。
但搜索每個文件,我確實發現:
/var/lib/NetworkManager/dhclient-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx-eth0.lease
(x 幾乎是隨機的字母和數字)一行fixed-address xxx.xxx...
看起來像 linuxfan 的答案中貼上的文件條目在
/var/log/syslog
透過 IP 位址(例如此處 192.168.1.2),您可以選擇其中一個(也許是最後一個,以防它經常變化)1 月 8 日 17:49:45 mint dhclient:eth0 上的 192.168.1.2 的 DHCPREQUEST 到 255.255.255.255 端口 67 (xid=0xXXXXXXX)
1 月8 日17:49:45189:4519. 1.2 的DHCPOFFER
17 號:49:45 mint dhclient:來自 192.168.1.1 的 192.168.1.2 的 DHCPACK 於
1 月 8 日 17:49:45 mint dhclient:綁定到更新192.168.12 秒內。
Jan 8 17:49:45 mint NetworkManager[1363]:位址 192.168.1.2
Jan 8 17:49:45 mint avahi-daemon[1117]:加入介面 eth0.IPv4 上的 mDNS 多播群組,位址為 192.168.12.168.12.168.12.168.12。
1 月 8 日 17:49:45 mint avahi-daemon[1117]:在 eth0.IPv4 上註冊 192.168.1.2 的新位址記錄。
或者,如果您使用的是 bash 或其他 shell 腳本或 shell 友好的腳本,這裡有一個管道友好的 grep & cut 方法來獲取 ip ifconfig
,更改eth0
為您喜歡的任何一個,甚至-a
是全部。
ifconfig eth0 | grep "inet addr" | cut -d : -f 2 | cut -d ' ' -f 1
它只需要time
-inggrep
一個文件,上面的需要
real 0m0.002s, user 0m0.000s, sys 0m0.000s
而grep
-ing 一個文件需要real 0m0.001s, user 0m0.000s, sys 0m0.000s
答案4
所有 DHCP 租約資訊都保存在/var/lib/dhcp/dhclient.eth0.leases
# tail -14 /var/lib/dhcp/dhclient.eth0.leases
lease {
interface "eth0";
fixed-address 192.168.0.13;
option subnet-mask 255.255.255.0;
option routers 192.168.0.1;
option dhcp-lease-time 604800;
option dhcp-message-type 5;
option domain-name-servers 75.75.75.75,75.75.76.76;
option dhcp-server-identifier 192.168.0.1;
option domain-name "hsd1.ca.comcast.net.";
renew 6 2015/01/10 10:38:07;
rebind 2 2015/01/13 16:19:22;
expire 3 2015/01/14 13:19:22;
}
話雖如此,解析以下輸出也沒什麼不好ifconfig