Jakie jest wyrażenie regularne do sprawdzania poprawności użytkowników systemu Linux?


Odpowiedzi:


12

Ogólna reguła dla nazwy użytkownika jest taka, że ​​jej długość nie może przekraczać 32 znaków. Podanie prawidłowej nazwy użytkownika zależy od Twojej dystrybucji.

W Debianie shadow-utils 4.1istnieje is_valid_namefunkcja w 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;
}

Długość nazwy użytkownika była sprawdzana wcześniej:

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

Ze strony podręcznika użytkownika useradd (8) :

Zazwyczaj zaleca się używanie tylko nazw użytkowników rozpoczynających się od małej litery lub znaku podkreślenia, po których następują małe litery, cyfry, podkreślenia lub myślniki. Mogą kończyć się znakiem dolara. W wyrażeniach regularnych: [a-z _] [a-z0-9 _-] * [$]?

W Debianie jedynym ograniczeniem jest to, że nazwy użytkowników nie mogą zaczynać się od myślnika ('-') ani zawierać dwukropka (':') ani białych znaków (spacja: '', koniec linii: '\ n', tabulacja: ' \ t ”itp.). Zauważ, że użycie ukośnika ('/') może złamać domyślny algorytm dla definicji katalogu domowego użytkownika.

Nazwy użytkowników mogą mieć maksymalnie 32 znaki.

Istnieje więc ogólna rekomendacja. Rzeczywiste ograniczenia zależą od specyfiki wdrożenia / dystrybucji. W systemach opartych na Debianie najwyraźniej nie ma bardzo trudnych ograniczeń. W rzeczywistości właśnie wypróbowałem useradd '€'swoje urządzenie Ubuntu i zadziałało. Oczywiście może to spowodować uszkodzenie niektórych aplikacji, które nie oczekują tak nietypowych nazw użytkowników. Aby uniknąć takich problemów, najlepiej postępować zgodnie z ogólnymi zaleceniami.


12

Przepraszam za nokautowanie tego prawie 4-letniego pytania, ale pojawia się dość wysoko w wynikach wyszukiwania w Internecie i wymaga nieco więcej uwagi.

Dokładniejszym wyrażeniem regularnym jest (tak, wiem, pomimo strony podręcznika):

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

Mam nadzieję, że to pomaga niektórym z tych, którzy szukają.

Aby to rozbić:

  1. Powinien rozpoczynać się ( ^) tylko małymi literami lub podkreślnikiem ( [a-z_]). Zajmuje dokładnie 1 postać.
  2. Powinien to być jeden z albo ( ( ... )):
    1. Od 0 do 31 znaków ( {0,31}) liter , cyfr , znaków podkreślenia i / lub łączników ( [a-z0-9_-]), LUB ( |)
    2. Od 0 do 30 znaków powyżej oraz symbol USD ( \$) na końcu, a następnie
  3. Żadnych znaków poza tym wzorem ( $).

Dla tych, którzy nie znają wzorców wyrażeń regularnych, możesz zapytać, dlaczego znak dolara miał odwrotny ukośnik w 2.2. ale nie w 3. Jest tak, ponieważ w większości (wszystkich?) wyrażeń regularnych znak dolara wskazuje koniec łańcucha (lub linii itp.). W zależności od używanego silnika, będzie trzeba go uciec, jeśli jest częścią rzeczywistego ciągu znaków (nie mogę oderwać od głowy silnika wyrażeń regularnych, który nie używa odwrotnego ukośnika jako ucieczki dla czystego wyrażenia) .

Zauważ, że Debian i Ubuntu usuwają pewne ograniczenia dla nazwy użytkownika w pełni zgodnej z POSIX / shadow upstream (na przykład i nie wiem, czy to zostało naprawione, ale pozwalają na rozpoczęcie nazwy użytkownika od liczby - co w rzeczywistości spowodowało to błąd ). Jeśli chcesz zagwarantować wieloplatformowość, poleciłbym powyższy wzorzec wyrażenia regularnego, a nie to, co przechodzi / kończy sprawdzanie w Debian, Ubuntu i innych.


Świetna odpowiedź. Można go łatwo zastosować także w Javie, używającjava.util.regex.Pattern.matches("^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\\$)$", user);
dokaspar

Powinno być [abcdefghijklmnopqrstuvwxyz]zamiast [a-z]. [a-z]w wielu silnikach wyrażeń regularnych dopasowuje także takie elementy é, œa czasem nawet wieloznakowe elementy zestawiające, jak dszw węgierskich lokalizacjach.
Stéphane Chazelas,

Nazwy użytkowników systemu Linux nie akceptują Unicode (chyba że są jawnie skonfigurowane do łamania zgodności z POSIX - 1 2 ). To sprawdzenie należy wykonać poza wyrażeniem regularnym, ponieważ jest to sprawdzanie poprawności danych wejściowych / środowiska / lokalizacji, a nie sprawdzanie poprawności ciągu. Ponadto chciałbym usłyszeć przykład silnika wyrażeń regularnych, który to robi. Wszystkie, które znam, pasują do ASCII i jeden musi jawnie włączyć Unicode, jeśli jest nawet obsługiwany.
brent saner
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.