Tut mir leid, dass ich diese fast 4 Jahre alte Frage in den Wahnsinn treibe, aber sie taucht ziemlich weit oben in den Internet-Suchergebnissen auf und verdient etwas mehr Aufmerksamkeit.
Eine genauere Regex ist (ja, ich weiß, trotz der Manpage):
^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\$)$
Hoffentlich hilft das einigen der Suchenden.
Um es aufzuschlüsseln:
- Es sollte starten (
^
) nur mit Kleinbuchstaben oder einem Unterstrich ([a-z_]
). Diese belegt genau 1 Charakter. - Dann sollte es eins sein von entweder (
( ... )
):- Von 0 bis 31 Zeichen (
{0,31}
) von Buchstaben , Zahlen , Unterstriche , und/oder Bindestriche ([a-z0-9_-]
), ODER (|
) - Von 0 bis 30 Zeichen des obigen Plus ein USD-Symbol (
\$
) am Ende und dann
- Von 0 bis 31 Zeichen (
- Keine weiteren Zeichen vergangen dieses Muster (
$
).
Für diejenigen, die mit Regex-Mustern nicht vertraut sind, fragen Sie sich vielleicht, warum das Dollarzeichen in 2.2 einen umgekehrten Schrägstrich hatte. aber nicht in 3. Dies liegt daran, dass das Dollarzeichen in den meisten (allen?) Regex-Varianten das Ende einer Zeichenfolge (oder Zeile usw.) anzeigt. Abhängig von der verwendeten Engine muss sie maskiert werden, wenn sie Teil der eigentlichen Zeichenfolge ist (ich kann mir auf Anhieb keine Regex-Engine vorstellen, die keinen Backslash als Escape für einen reinen Ausdruck verwendet). .
Beachten Sie, dass Debian und Ubuntu einige Einschränkungen für einen vollständig POSIX/Shadow-Upstream-kompatiblen Benutzernamen entfernen (zum Beispiel, und ich weiß nicht, ob dies behoben wurde, aber sie erlauben, dass der Benutzername mit einer Zahl beginnt – was tatsächlich die Ursache dafür ist Insekt). Wenn Sie plattformübergreifend garantieren möchten, würde ich eher das obige Regex-Muster empfehlen als das, was die Prüfung in Debian, Ubuntu und anderen bestanden/nicht bestanden hat.
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:[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 Home-Verzeichnisses des Benutzers beschädigen kann.
Benutzernamen dürfen maximal 32 Zeichen lang sein.
Es gibt also eine allgemeine Empfehlung. Die tatsächlichen Einschränkungen hängen von den Besonderheiten Ihrer Implementierung/Distribution ab. Auf Debian-basierten Systemen gibt es anscheinend keine sehr harten Einschränkungen. Tatsächlich habe ich gerade useradd '€'
ausprobiert auf meiner Ubuntu-Box, und es hat funktioniert. Dies kann natürlich einige Anwendungen beschädigen, die solche ungewöhnlichen Benutzernamen nicht erwarten. Um solche Probleme zu vermeiden, befolgen Sie am besten die allgemeine Empfehlung.
Die allgemeine Regel für den Benutzernamen lautet, dass seine Länge weniger als 32 Zeichen betragen muss. Es hängt von Ihrer Distribution ab, was ein gültiger Benutzername ist.
Unter Debian shadow-utils 4.1
, gibt es einen 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 überprü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);
}