Lors de l'ajout d'un nouvel utilisateur, comment la chaîne est-elle validée?
Je suppose qu'il y a une expression régulière. Quelle est cette expression régulière?
la source
Lors de l'ajout d'un nouvel utilisateur, comment la chaîne est-elle validée?
Je suppose qu'il y a une expression régulière. Quelle est cette expression régulière?
La règle générale pour le nom d'utilisateur est que sa longueur doit être inférieure à 32 caractères. Cela dépend de votre distribution pour créer un nom d'utilisateur valide.
Dans Debian, shadow-utils 4.1
il y a une is_valid_name
fonction dans 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;
}
Et la longueur du nom d'utilisateur a été vérifiée avant:
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);
}
Depuis la page de manuel de useradd (8) :
Il est généralement recommandé de n'utiliser que des noms d'utilisateur commençant par une lettre minuscule ou un trait de soulignement, suivis de lettres minuscules, de chiffres, de traits de soulignement ou de tirets. Ils peuvent se terminer par un signe dollar. En termes d'expression régulière: [a-z _] [a-z0-9 _-] * [$]?
Sur Debian, les seules contraintes sont que les noms d'utilisateur ne doivent ni commencer par un tiret ('-') ni contenir un deux-points (':') ou un espace (espace: '', fin de ligne: '\ n', tabulation: ' \ t ', etc.). Notez que l'utilisation d'une barre oblique ('/') peut casser l'algorithme par défaut pour la définition du répertoire personnel de l'utilisateur.
Les noms d'utilisateur ne peuvent contenir que 32 caractères maximum.
Il y a donc une recommandation générale. Les contraintes réelles dépendent des spécificités de votre implémentation / distribution. Sur les systèmes basés sur Debian, il n'y a apparemment pas de contraintes très dures. En fait, je viens d'essayer useradd '€'
ma boîte Ubuntu, et cela a fonctionné. Bien sûr, cela peut casser certaines applications qui n'attendent pas de noms d'utilisateur aussi inhabituels. Pour éviter de tels problèmes, il est préférable de suivre la recommandation générale.
Désolé d'avoir nécrobé cette question vieille de presque 4 ans, mais elle apparaît assez haut dans les résultats de recherche sur Internet et mérite un peu plus d'attention.
Un regex plus précis est (oui, je sais, malgré la page de manuel):
^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\$)$
J'espère que cela aidera certains de ceux qui recherchent.
Pour le décomposer:
^
) avec uniquement des lettres minuscules ou un trait de soulignement ( [a-z_]
). Cela occupe exactement 1 caractère.( ... )
):
{0,31}
) de lettres , chiffres , traits de soulignement et / ou tirets ( [a-z0-9_-]
), OU ( |
)\$
) à la fin, puis$
).Pour ceux qui ne connaissent pas les schémas d'expression rationnelle, vous pouvez vous demander pourquoi le signe dollar a eu une barre oblique inverse en 2.2. mais pas dans 3. C'est parce que dans la plupart (toutes?) des variantes d'expression régulière, le signe dollar indique la fin d'une chaîne (ou d'une ligne, etc.). Selon le moteur utilisé, il devra être échappé s'il fait partie de la chaîne réelle (je ne peux pas penser au dessus de ma tête d'un moteur regex qui n'utilise pas la barre oblique inverse comme échappement pour une expression pure) .
Notez que Debian et Ubuntu supprimer certaines restrictions pour une Posix / shadow entièrement en amont les noms d' utilisateurs (par exemple, et je ne sais pas si cela a été corrigé, mais ils permettent le nom d' utilisateur de commencer par un certain nombre - qui en fait est ce qui a causé cette bug ). Si vous voulez garantir la multiplicité des plates-formes, je recommanderais le modèle d'expression régulière ci-dessus plutôt que ce qui réussit / échoue la vérification dans Debian, Ubuntu et autres.
java.util.regex.Pattern.matches("^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\\$)$", user);
[abcdefghijklmnopqrstuvwxyz]
au lieu de[a-z]
.[a-z]
dans de nombreux moteurs d'expressions rationnelles, correspond également à des éléments commeé
,œ
ou même parfois des éléments de classement à plusieurs caractères commedsz
dans les environnements hongrois.