在https://stackoverflow.com/questions/24932172/what-length-can-a-network-interface-name-have,有人询问网络接口名称可以有多长(显然是 16 字节)。然而,该问题的答案似乎没有链接到有关该名称的其他限制的任何信息,例如:
- 字符集(例如,
ip link
我能够将;rm
和-f
作为有效名称,但它似乎无法解析带有空格的名称(尽管这可能只是其参数解析器的产物,实际上并不能防止出现问题)值))。 - 最小长度(1 字节名称有效)
- 编码(在我的终端中创建
α
显示__
,并且不能通过名称删除α
)
是否有关于接口可以被调用的内容以及在哪一层强制执行的文档(例如在内核、iproute2、libc 中)?
上下文:编写一个接受将存储在数据库中的接口名称的 CLI 命令,我想确定可以对坏名称进行多少过滤,而不会导致奇怪命名(尽管可能不是敌意)接口的问题。
答案1
接口名称不应类似于ethNUM
,wlanNUM
或usbNUM
。
这些名称由内核使用,如果您尝试将接口重命名为类似的名称,您将会遇到麻烦。根据我自己的经验,我知道这一点(试图保持两个接口稳定地命名为eth0
和eth1
,无论内核初始化它们的顺序如何)。
看这。
至于青蛙字符,内核的接口(ioctl(SIOCSIFNAME)
……dev_change_name()
dev_valid_name()
) 将拒绝任何为空字符串的接口名称,.
或..
, 包含任何/
,:
或空格 ( [\t\n\v\f\r \xa0]
),或长于15(不是 16)字节:
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
;-)