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

21

W przypadku dodawania nowego użytkownika, jak weryfikowany jest ciąg?

Przypuszczam, że istnieje wyrażenie regularne. Co to za wyrażenie regularne?

Ionică Bizău
źródło

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);
}
Cuonglm
źródło
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.

Malte Skoruppa
źródło
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.

Brent Saner
źródło
Ś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