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


답변:


12

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);
}

15

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

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

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

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

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


12

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


좋은 대답입니다. java.util.regex.Pattern.matches("^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\\$)$", user);
dokaspar

[abcdefghijklmnopqrstuvwxyz]대신 이어야합니다 [a-z]. [a-z]많은 정규 표현식 엔진도 같은 것들과 일치 é, œ심지어 나 같은 때때로 멀티 문자 조합 요소 dsz헝가리어 로케일을.
Stéphane Chazelas

Linux 사용자 이름은 POSIX 준수를 위반하도록 명시 적으로 구성되지 않은 경우 유니 코드를 허용하지 않습니다 ( 1 2 ). 이 검사는 문자열 유효성 검사가 아닌 입력 / 환경 / 현지화 유효성 검사이므로 정규식 외부에서 수행해야합니다. 또한이 작업을 수행하는 정규식 엔진의 예를 듣고 싶습니다. ASCII에서 일치하는 것으로 알고있는 모든 것은 유니 코드가 지원되는 경우 명시 적으로 유니 코드를 활성화해야합니다.
brent saner
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.