Linux
linux上的網路介面名稱有什麼限制(如果有的話)
在https://stackoverflow.com/questions/24932172/what-length-can-a-network-interface-name-have中,有人詢問網路介面名稱可以有多長(顯然是 16 個字節)。但是,該問題的答案似乎沒有連結到有關名稱還有哪些其他限制的任何資訊,例如:
- 字元集(例如,
ip link
我可以擁有;rm
和-f
作為有效名稱,但它似乎無法解析帶有空格的名稱(儘管這可能只是其參數解析器的人工製品,實際上並不是針對有問題的保護)值))。- 最小長度(1 字節名稱有效)
- 編碼(在我的終端中創建
α
顯示__
,並且不能通過名稱刪除α
)是否有任何關於可以呼叫介面以及在哪個層執行介面的文件(例如在核心、iproute2、libc 中)?
上下文:編寫一個接受介面名稱的 CLI 命令,該介面名稱將儲存在數據庫中,我想確定我可以對壞名稱進行多少過濾,而不會導致奇怪命名(儘管可能不是敵對的)介面出現問題。
介面名稱不應像
ethNUM
,wlanNUM
或usbNUM
。這些名稱由核心使用,如果您嘗試將介面重命名為類似名稱,您將遇到麻煩。我從我自己的經驗中知道這一點(試圖保持兩個介面穩定命名
eth0
和eth1
,而不管核心初始化它們的順序如何)。看到這個。
對於青蛙字元,核心的介面 (
ioctl(SIOCSIFNAME)
…dev_change_name()
…dev_valid_name()
) 將拒絕任何為空字元串、包含任何、.
或空格 ( ) 或超過15(不是 16)字節的介面名稱:..``/``:``[\t\n\v\f\r \xa0]
bool dev_valid_name(const char *name) { if (*name == '\0') return false; if (strnlen(name, IFNAMSIZ) == IFNAMSIZ) return false; if (!strcmp(name, ".") || !strcmp(name, "..")) return false; while (*name) { if (*name == '/' || *name == ':' || isspace(*name)) return false; name++; } return true; }
其他控製字元,如
\x1b
(ESC)、不可見/雙向標記或任何類型的二進制垃圾都可以正常工作。例如,您可以嘗試:ip link add dev $'\e[1;41;33m' type bridge
;-)