존재하다https://stackoverflow.com/questions/24932172/what-length-can-a-network-interface-name-have, 누군가 네트워크 인터페이스 이름의 길이(분명히 16바이트)를 물었습니다. 그러나 해당 질문에 대한 답변은 다음과 같은 이름의 다른 제한 사항에 대한 정보와 연결되지 않는 것 같습니다.
- charset(예: 및 유효한 이름을
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
;-)