Quelle est l'expression rationnelle pour valider les utilisateurs Linux?

21

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?

Ionică Bizău
la source

Réponses:

12

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.1il y a une is_valid_namefonction 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);
}
cuonglm
la source
15

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.

Malte Skoruppa
la source
12

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:

  1. Il doit commencer ( ^) avec uniquement des lettres minuscules ou un trait de soulignement ( [a-z_]). Cela occupe exactement 1 caractère.
  2. Il doit alors s'agir de l' un des deux ( ( ... )):
    1. De 0 à 31 caractères ( {0,31}) de lettres , chiffres , traits de soulignement et / ou tirets ( [a-z0-9_-]), OU ( |)
    2. De 0 à 30 caractères ci-dessus plus un symbole USD ( \$) à la fin, puis
  3. Plus de caractères après ce modèle ( $).

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.

brent saner
la source
Très bonne réponse. Peut facilement être appliqué également en Java en utilisantjava.util.regex.Pattern.matches("^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\\$)$", user);
dokaspar
Ce devrait être [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 comme dszdans les environnements hongrois.
Stéphane Chazelas
Les noms d'utilisateur Linux n'acceptent pas Unicode (sauf s'ils sont explicitement configurés pour rompre la conformité POSIX - 1 2 ). Cette vérification doit être effectuée en dehors de l'expression régulière, car il s'agit d'une validation d'entrée / d'environnement / de localisation, et non d'une validation de chaîne. De plus, j'aimerais entendre un exemple d'un moteur regex qui fait cela. Tous ceux que je connais correspondent sur ASCII et l'un doit explicitement activer Unicode, s'il est même pris en charge.
brent saner le