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?
quelle
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?
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.1
gibt es eine is_valid_name
Funktion 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);
}
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.
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:
^
) mit nur Kleinbuchstaben oder einem Unterstrich ( [a-z_]
). Dies belegt genau 1 Zeichen.( ... )
):
{0,31}
) für Buchstaben , Zahlen , Unterstriche und / oder Bindestriche ( [a-z0-9_-]
), ODER ( |
)\$
) am Ende und dann$
).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.
java.util.regex.Pattern.matches("^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\\$)$", user);
[abcdefghijklmnopqrstuvwxyz]
statt[a-z]
.[a-z]
in vielen regexp Motoren entspricht auch Dinge wieé
,œ
oder sogar manchmal mit mehreren Zeichen Abgleichs Elemente wiedsz
in der ungarischen Gegenden.