Quando si aggiunge un nuovo utente, come viene convalidata la stringa?
Suppongo che ci sia un'espressione regolare. Cos'è quella espressione regolare?
Quando si aggiunge un nuovo utente, come viene convalidata la stringa?
Suppongo che ci sia un'espressione regolare. Cos'è quella espressione regolare?
Risposte:
La regola generale per il nome utente è che la sua lunghezza deve essere inferiore a 32 caratteri. Dipende dalla tua distribuzione per creare un nome utente valido.
In Debian, shadow-utils 4.1
c'è una is_valid_name
funzione in 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;
}
E la lunghezza del nome utente è stata verificata prima:
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);
}
Dalla pagina man di useradd (8) :
In genere si consiglia di utilizzare solo nomi utente che iniziano con una lettera minuscola o un trattino basso, seguiti da lettere minuscole, cifre, caratteri di sottolineatura o trattini. Possono finire con un segno di dollaro. In termini di espressione regolare: [a-z _] [a-z0-9 _-] * [$]?
Su Debian, gli unici vincoli sono che i nomi utente non devono iniziare con un trattino ('-') né contenere due punti (':') o uno spazio bianco (spazio: '', fine riga: '\ n', tabulazione: ' \ t ', ecc.). Si noti che l'utilizzo di una barra ('/') potrebbe interrompere l'algoritmo predefinito per la definizione della home directory dell'utente.
I nomi utente possono avere una lunghezza massima di 32 caratteri.
Quindi, c'è una raccomandazione generale. I vincoli effettivi dipendono dalle specifiche dell'implementazione / distribuzione. Sui sistemi basati su Debian, apparentemente non ci sono vincoli molto duri. In effetti, ho appena provato la useradd '€'
mia scatola Ubuntu e ha funzionato. Naturalmente, ciò potrebbe interrompere alcune applicazioni che non prevedono nomi utente così insoliti. Per evitare tali problemi, è meglio seguire la raccomandazione generale.
Ci scusiamo per il necrobumping di questa domanda di quasi 4 anni, ma risulta piuttosto alta nei risultati di ricerca su Internet e merita un po 'più di attenzione.
Un regex più accurato è (sì, lo so, nonostante la pagina man):
^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\$)$
Spero che questo aiuti alcuni di coloro che cercano.
Per scomporlo:
^
) con solo lettere minuscole o un trattino basso ( [a-z_]
). Occupa esattamente 1 carattere.( ... )
):
{0,31}
) di lettere , numeri , caratteri di sottolineatura , e / o trattini ( [a-z0-9_-]
), OR ( |
)\$
) alla fine, quindi$
).Per coloro che non hanno familiarità con i modelli regex, potresti chiedere perché il simbolo del dollaro ha avuto una battuta d'arresto in 2.2. ma non in 3. Questo perché nella maggior parte (tutte?) delle varianti regex, il simbolo del dollaro indica la fine di una stringa (o linea, ecc.). A seconda del motore utilizzato, dovrà essere evitato se fa parte della stringa effettiva (non riesco a pensare in cima alla mia testa di un motore regex che non usa la barra rovesciata come fuga per un'espressione pura) .
Si noti che Debian e Ubuntu rimuovono alcune restrizioni per un nome utente completamente compatibile con POSIX / shadow upstream (per esempio, e non so se questo è stato corretto, ma consentono al nome utente di iniziare con un numero - che in realtà è ciò che ha causato questo bug ). Se vuoi garantire multipiattaforma, consiglierei il modello regex sopra piuttosto che ciò che supera / fallisce il controllo in Debian, Ubuntu e altri.
[abcdefghijklmnopqrstuvwxyz]
invece di [a-z]
. [a-z]
in molti motori regexp corrispondono anche elementi come é
, œ
o talvolta anche elementi di confronto multi-carattere come dsz
nelle localizzazioni ungheresi.
java.util.regex.Pattern.matches("^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\\$)$", user);