W przypadku dodawania nowego użytkownika, jak weryfikowany jest ciąg?
Przypuszczam, że istnieje wyrażenie regularne. Co to za wyrażenie regularne?
W przypadku dodawania nowego użytkownika, jak weryfikowany jest ciąg?
Przypuszczam, że istnieje wyrażenie regularne. Co to za wyrażenie regularne?
Odpowiedzi:
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.1
istnieje is_valid_name
funkcja 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);
}
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.
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ć:
^
) tylko małymi literami lub podkreślnikiem ( [a-z_]
). Zajmuje dokładnie 1 postać.( ... )
):
{0,31}
) liter , cyfr , znaków podkreślenia i / lub łączników ( [a-z0-9_-]
), LUB ( |
)\$
) na końcu, a następnie$
).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.
[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 dsz
w węgierskich lokalizacjach.
java.util.regex.Pattern.matches("^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\\$)$", user);