Linux 사용자를 검증하는 정규식은 무엇입니까? 유효성은 어떻게

새 사용자를 추가 할 때 문자열의 유효성은 어떻게 확인됩니까?

정규식이 있다고 가정합니다. 그 정규식은 무엇입니까?



답변

username의 일반적인 규칙은 길이가 32 자 미만이어야한다는 것입니다. 유효한 사용자 이름을 만들기 위해 배포판에 따라 다릅니다.

데비안 shadow-utils 4.1에는 다음과 같은 is_valid_name기능이 있습니다 chkname.c.

static bool is_valid_name (const char *name)
{
    /*
     * User/group names must match [a-z_][a-z0-9_-]*[$]
     */
    if (('\0' == *name) ||
        !((('a' <= *name) && ('z' >= *name)) || ('_' == *name))) {
        return false;
    }

    while ('\0' != *++name) {
        if (!(( ('a' <= *name) && ('z' >= *name) ) ||
              ( ('0' <= *name) && ('9' >= *name) ) ||
              ('_' == *name) ||
              ('-' == *name) ||
              ( ('$' == *name) && ('\0' == *(name + 1)) )
             )) {
            return false;
        }
    }

    return true;
}

그리고 사용자 이름의 길이는 전에 확인되었습니다.

bool is_valid_user_name (const char *name)
{
    /*
     * User names are limited by whatever utmp can
     * handle.
     */
    if (strlen (name) > USER_NAME_MAX_LENGTH) {
        return false;
    }

    return is_valid_name (name);
}

답변

보내는 사람 은 useradd (8)의 맨 페이지 :

일반적으로 소문자 또는 밑줄로 시작하고 소문자, 숫자, 밑줄 또는 대시로 시작하는 사용자 이름 만 사용하는 것이 좋습니다. 그들은 달러 기호로 끝날 수 있습니다. 정규식 용어로 : [a-z _] [a-z0-9 _-] * [$]?

데비안에서 유일한 제약은 사용자 이름이 대시 ( ‘-‘)로 시작하거나 콜론 ( ‘:’)이나 공백 ( ‘:’, 줄 끝 : ‘\ n’, 표 : ‘을 포함하지 않아야한다는 것입니다. \ t ‘등). 슬래시 ( ‘/’)를 사용하면 사용자의 홈 디렉토리 정의에 대한 기본 알고리즘이 중단 될 수 있습니다.

사용자 이름은 최대 32 자입니다.

따라서 일반적인 권장 사항이 있습니다. 실제 제약 조건은 구현 / 배포의 세부 사항에 따라 다릅니다. 데비안 기반 시스템에는 분명 어려운 제약이 없습니다. 사실, 나는 방금 useradd '€'우분투 상자를 시험해 보았습니다 . 물론 이로 인해 비정상적인 사용자 이름을 기대하지 않는 일부 응용 프로그램이 중단 될 수 있습니다. 이러한 문제를 피하려면 일반적인 권장 사항을 따르는 것이 가장 좋습니다.


답변

거의 4 살짜리이 질문에 대해 괴상한 점을 알려 드려 죄송하지만 인터넷 검색 결과에서 꽤 많이 나오므로주의를 기울여야합니다.

보다 정확한 정규 표현식은 다음과 같습니다 (예, 맨 페이지에도 불구하고).

^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\$)$

잘하면 그것은 그 일부 검색에 도움이됩니다.

그것을 분해하려면 :

  1. 그것은해야 시작 ( ^소문자 또는 밑줄 (과) [a-z_]). 이것은 정확히 1 문자를 차지합니다 .
  2. 그럼해야 하나 ( ( ... ))
    1. 에서 0(31) 문자 ( {0,31})의 문자 , 숫자 , 밑줄 , 및 / 또는 하이픈 ( [a-z0-9_-]) 또는 ( |)
    2. 위의 0 에서 30 자 사이에 끝에 USD 기호 ( )를 더한\$ 다음
  3. 이 패턴을 지나는 문자가 더 이상 없습니다 ( $).

정규식 패턴에 익숙하지 않은 사람들은 왜 달러 기호가 2.2에서 백 슬래시를 갖는지 물을 수 있습니다. 그러나 대부분의 (모든?) 정규식 변형에서 달러 기호는 문자열 (또는 줄 등)의 끝을 나타 내기 때문입니다. 사용되는 엔진에 따라 실제 문자열의 일부인 경우 이스케이프해야합니다 (백 슬래시를 순수한 식의 이스케이프로 사용하지 않는 정규식 엔진의 머리 꼭대기에서는 생각할 수 없습니다) .

참고 데비안과 우분투는 완전히 POSIX에 대한 몇 가지 제한 사항을 제거하는 것이 / 예를 들어 (업스트림 준수 이름을 그림자,이 고정 된 경우는 모르겠지만, 그들은 이름이 숫자로 시작할 수 있습니다 – 실제로 원인이다 이 버그 ). 크로스 플랫폼을 보장하려면 데비안, 우분투 및 기타의 검사를 통과 / 실패하는 대신 위의 정규식 패턴을 권장합니다.