在某些 Linux 電腦上,ifconfig
以大寫顯示 MAC 位址(「HWaddr」)十六進位數字。在其他 Linux 電腦上,[af] 數字是小寫的。
為什麼有差別?該程式是否有兩個相互競爭的版本?有沒有什麼地方可以控制它?
答案1
有幾個可能的原因。
不同的介面類型
一種可能性:ifconfig
將硬體位址的列印委託給介面實作。實際的列印是由interface
結構中的函數執行的net-tools-1.60
(來自這裡),由 調用lib/interface.c
,第 678 行:
printf(_("HWaddr %s "), hw->print(ptr->hwaddr));
nettools-1.60
有關支援的介面類型列表,請參閱in 的原始碼lib/hw.c
:乙太網路、光纖、令牌環等都有單獨的實作。
現在到實際的列印功能: 範例lib/ether.c
::
/* Display an Ethernet address in readable format. */
static char *pr_ether(unsigned char *ptr)
{
static char buff[64];
snprintf(buff, sizeof(buff), "%02X:%02X:%02X:%02X:%02X:%02X",
(ptr[0] & 0377), (ptr[1] & 0377), (ptr[2] & 0377),
(ptr[3] & 0377), (ptr[4] & 0377), (ptr[5] & 0377)
);
return (buff);
}
x
透過在格式化字串中使用小寫 s(即%02x
代替) ,可以實現不同類型的網路介面以不同方式顯示相同類型的信息%02X
。例如,IrDA 介面使用小寫十六進位數字 ( lib/irda.c
):
/*
* Function irda_print (ptr)
*
* Print hardware address of interface
*
*/
static char *irda_print(unsigned char *ptr)
{
static char buff[8];
sprintf(&buff[strlen(buff)], "%02x:%02x:%02x:%02x", ptr[3], ptr[2],
ptr[1], ptr[0]);
return (buff);
}
補丁到ifconfig
另一種可能性,也可能是這裡的原因:發行版經常更改軟體包。上面的程式碼片段來自原始的net-tools-1.60
,讓我們看看 Debian 的,或者更確切地說,它的補丁net-tools-1.60-23.diff
(來自這裡):
+--- net-tools.orig/lib/ether.c
++++ net-tools/lib/ether.c
[...]
+@@ -39,7 +39,7 @@ static char *pr_ether(unsigned char *ptr
+ {
+ static char buff[64];
+
+- snprintf(buff, sizeof(buff), "%02X:%02X:%02X:%02X:%02X:%02X",
++ snprintf(buff, sizeof(buff), "%02x:%02x:%02x:%02x:%02x:%02x",
+ (ptr[0] & 0377), (ptr[1] & 0377), (ptr[2] & 0377),
+ (ptr[3] & 0377), (ptr[4] & 0377), (ptr[5] & 0377)
+ );
因此 Debian 為其發行版修補了原始碼ifconfig
,Ubuntu 也可能會採用該原始碼(維基百科:「Ubuntu 軟體包基於 Debian不穩定分支的軟體包”)。