Linux 사용자를 인증하는 정규식은 무엇입니까?

Linux 사용자를 인증하는 정규식은 무엇입니까?

새 사용자를 추가할 때 문자열을 어떻게 확인합니까?

정규 표현식을 갖고 싶습니다. 그 정규식은 무엇입니까?

답변1

거의 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_-]),

    또는( |)

    1. ~에서0도착하다30위의 문자추가하다\$끝에 달러 기호( )가 있고,

    그런 다음

  3. 더 이상 문자가 없습니다과거이 모드( $).

정규식에 익숙하지 않은 분들을 위해 2.2에서는 달러 기호에 백슬래시가 있지만 3에서는 없는 이유가 무엇인지 궁금할 것입니다. 이는 대부분의 (모두?) 정규식 변형에서 달러 기호가 문자열(또는 줄) 등의 끝을 나타내기 때문입니다. ). 사용된 엔진에 따라 실제 문자열의 일부인 경우 이스케이프해야 합니다(백슬래시를 이스케이프로 사용하지 않는 정규식 엔진은 상상할 수 없습니다).

데비안과 우분투는 POSIX/섀도우 업스트림과 완전히 호환되는 사용자 이름에 대한 일부 제한 사항을 제거했습니다(예: 이것이 수정되었는지는 모르겠지만 사용자 이름이 숫자로 시작하는 것을 허용했습니다. 실제로는이 오류). 크로스 플랫폼을 보장하려면 Debian, Ubuntu 등의 통과/실패 확인 정규식 대신 위의 정규식을 사용하는 것이 좋습니다.

답변2

~에서useradd(8) 매뉴얼 페이지:

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

Debian에서 유일한 제한 사항은 사용자 이름이 대시('-')로 시작하거나 콜론(':') 또는 공백(공백: ' ', 줄 끝: '\n', 탭: ')을 포함할 수 없다는 것입니다. \t' 등). 슬래시("/")를 사용하면 사용자의 홈 디렉터리에 정의된 기본 알고리즘이 손상될 수 있습니다.

사용자 이름은 최대 32자까지만 가능합니다.

그래서 일반적인 제안입니다. 실제 한도는 구현/배포의 세부 사항에 따라 다릅니다. 데비안 기반 시스템에는 매우 엄격한 제한이 없습니다. 사실 방금 useradd '€'우분투 상자에서 시도해 보았더니 효과가 있었습니다. 물론 이렇게 하면 이러한 특이한 사용자 이름을 기대하지 않는 일부 응용 프로그램이 중단될 수 있습니다. 이러한 문제를 방지하려면 일반적인 권장 사항을 따르는 것이 가장 좋습니다.

답변3

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

데비안에는 다음과 같은 기능이 shadow-utils 4.1있습니다 .is_valid_namechkname.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);
}

관련 정보