Was ist der reguläre Ausdruck, um Linux-Benutzer zu validieren?

21

Wie wird die Zeichenfolge beim Hinzufügen eines neuen Benutzers überprüft?

Ich nehme an, es gibt einen regulären Ausdruck. Was ist das für ein regulärer Ausdruck?

Ionică Bizău
quelle

Antworten:

12

Die allgemeine Regel für den Benutzernamen ist, dass die Länge weniger als 32 Zeichen betragen darf. Es hängt von Ihrer Distribution ab, welchen Benutzernamen Sie verwenden.

In Debian shadow-utils 4.1gibt es eine is_valid_nameFunktion 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;
}

Und die Länge des Benutzernamens wurde vorher geprüft:

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
quelle
15

Aus der Manpage von useradd (8) :

Es wird normalerweise empfohlen, nur Benutzernamen zu verwenden, die mit einem Kleinbuchstaben oder einem Unterstrich beginnen, gefolgt von Kleinbuchstaben, Ziffern, Unterstrichen oder Bindestrichen. Sie können mit einem Dollarzeichen enden. In regulären Ausdrücken ausgedrückt: [a-z _] [a-z0-9 _-] * [$]?

Unter Debian bestehen die einzigen Einschränkungen darin, dass Benutzernamen weder mit einem Bindestrich ('-') beginnen noch einen Doppelpunkt (':') oder ein Leerzeichen (Leerzeichen: '', Zeilenende: '\ n', Tabellierung: 'enthalten dürfen. \ t 'usw.). Beachten Sie, dass die Verwendung eines Schrägstrichs ('/') den Standardalgorithmus für die Definition des Basisverzeichnisses des Benutzers verletzen kann.

Benutzernamen dürfen nur bis zu 32 Zeichen lang sein.

Es gibt also eine allgemeine Empfehlung. Die tatsächlichen Einschränkungen hängen von den Besonderheiten Ihrer Implementierung / Verteilung ab. Auf Debian-basierten Systemen gibt es anscheinend keine sehr harten Einschränkungen. Tatsächlich habe ich gerade useradd '€'meine Ubuntu-Box ausprobiert und es hat funktioniert. Dies kann natürlich zu Problemen bei einigen Anwendungen führen, die solche ungewöhnlichen Benutzernamen nicht erwarten. Um solche Probleme zu vermeiden, befolgen Sie am besten die allgemeinen Empfehlungen.

Malte Skoruppa
quelle
12

Es tut mir leid, dass ich diese fast 4-jährige Frage nicht beantwortet habe, aber sie taucht in den Internet-Suchergebnissen ziemlich häufig auf und verdient ein wenig mehr Aufmerksamkeit.

Ein genauerer regulärer Ausdruck ist (ja, ich weiß, trotz der Manpage):

^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\$)$

Hoffentlich hilft das einigen bei der Suche.

Um es aufzuschlüsseln:

  1. Es sollte beginnen ( ^) mit nur Kleinbuchstaben oder einem Unterstrich ( [a-z_]). Dies belegt genau 1 Zeichen.
  2. Dann sollte es eines von beiden sein ( ( ... )):
    1. Von 0 bis 31 Zeichen ( {0,31}) für Buchstaben , Zahlen , Unterstriche und / oder Bindestriche ( [a-z0-9_-]), ODER ( |)
    2. Von 0 bis 30 Zeichen des oben genannten und ein USD-Symbol ( \$) am Ende und dann
  3. Keine Zeichen mehr nach diesem Muster ( $).

Für diejenigen, die mit Regex-Mustern nicht vertraut sind, können Sie sich fragen, warum das Dollarzeichen in 2.2 einen Backslash aufwies. Dies geschah jedoch nicht in 3. Dies liegt daran, dass in den meisten (allen?) Regex-Varianten das Dollarzeichen das Ende einer Zeichenfolge (oder Zeile usw.) angibt. Abhängig von der verwendeten Engine muss ein Escapezeichen gesetzt werden, wenn es Teil der tatsächlichen Zeichenfolge ist. .

Beachten Sie, dass Debian und Ubuntu einige Einschränkungen für einen vollständig POSIX- / Shadow-Upstream-kompatiblen Benutzernamen aufheben (zum Beispiel, und ich weiß nicht, ob dies behoben wurde, aber sie erlauben dem Benutzernamen, mit einer Zahl zu beginnen - was tatsächlich der Grund dafür ist Fehler ). Wenn Sie plattformübergreifend garantieren möchten, empfehle ich das obige Regex-Muster und nicht, was die Prüfung in Debian, Ubuntu und anderen bestanden hat / nicht bestanden hat.

Brent Saner
quelle
Gute Antwort. Kann mitjava.util.regex.Pattern.matches("^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\\$)$", user);
dokaspar
Es sollte [abcdefghijklmnopqrstuvwxyz]statt [a-z]. [a-z]in vielen regexp Motoren entspricht auch Dinge wie é, œoder sogar manchmal mit mehreren Zeichen Abgleichs Elemente wie dszin der ungarischen Gegenden.
Stéphane Chazelas
Linux-Benutzernamen akzeptieren kein Unicode (es sei denn, sie sind explizit so konfiguriert, dass die POSIX-Konformität verletzt wird - 1 2 ). Diese Überprüfung sollte außerhalb des regulären Ausdrucks erfolgen, da es sich um eine Eingabe- / Umgebungs- / Lokalisierungsvalidierung und nicht um eine Zeichenfolgenvalidierung handelt. Außerdem würde ich gerne ein Beispiel für eine Regex-Engine hören, die dies tut. Alle, von denen ich weiß, dass sie mit ASCII übereinstimmen, und man muss Unicode explizit aktivieren, wenn es überhaupt unterstützt wird.
Brent Saner