Qual è la regex per convalidare gli utenti Linux?


21

Quando si aggiunge un nuovo utente, come viene convalidata la stringa?

Suppongo che ci sia un'espressione regolare. Cos'è quella espressione regolare?

Risposte:


12

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.1c'è una is_valid_namefunzione 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);
}

15

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.


12

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:

  1. Dovrebbe iniziare ( ^) con solo lettere minuscole o un trattino basso ( [a-z_]). Occupa esattamente 1 carattere.
  2. Quindi dovrebbe essere uno dei due ( ( ... )):
    1. Da 0 a 31 caratteri ( {0,31}) di lettere , numeri , caratteri di sottolineatura , e / o trattini ( [a-z0-9_-]), OR ( |)
    2. Da 0 a 30 caratteri di cui sopra più un simbolo USD ( \$) alla fine, quindi
  3. Non ci sono più personaggi oltre questo schema ( $).

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.


Bella risposta. Può essere facilmente applicato anche in Java usandojava.util.regex.Pattern.matches("^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\\$)$", user);
dokaspar

Dovrebbe essere [abcdefghijklmnopqrstuvwxyz]invece di [a-z]. [a-z]in molti motori regexp corrispondono anche elementi come é, œo talvolta anche elementi di confronto multi-carattere come dsznelle localizzazioni ungheresi.
Stéphane Chazelas,

I nomi utente Linux non accettano Unicode (a meno che non siano esplicitamente configurati per violare la conformità POSIX - 1 2 ). Questo controllo dovrebbe essere eseguito al di fuori di regex, in quanto si tratta di una convalida input / ambiente / localizzazione, non di una convalida stringa. Inoltre, mi piacerebbe sentire un esempio di un motore regex che fa questo. Tutti quelli che conosco corrispondono su ASCII e uno deve abilitare esplicitamente Unicode, se è supportato.
brent saner,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.