Warum können Linux-Benutzernamen nicht mit Zahlen beginnen?

84

Gibt es einen technischen Grund dafür? Ist dies ein Artefakt aus den Anfängen von Linux oder Unix, und wenn ja, gibt es einen Grund, warum es so bleibt?

43Tesserakte
quelle
22
Was ist Ihre Quelle für diese Aussage, da dies in den Antworten entlarvt wurde?
l0b0
19
@ l0b0 - per useradd(from shadow-utils 4.2.1) manual page (siehe CAVEATS ):Usernames must start with a lower case letter or an underscore [...] In regular expression terms: [a-z_][a-z0-9_-]*[$]?
don_crissti
30
@ l0b0 - oh, und nur weil eine Distribution (berühmt für diese Art von Dingen) dies zulässt, heißt das noch lange nicht "es wurde in den Antworten entlarvt" . Die Frage ist markiert linux, nicht ubuntu. Versuchen Sie es auf Archlinux .
don_crissti
1
@don_crissti Es gilt eindeutig nicht für alle Linux-Distributionen, und daher war es interessant zu wissen, woher diese Einschränkung kommen würde.
l0b0
5
Auch Ubuntu kümmert es: Wenn Sie mit der Live-CD / Ubiquity installieren, muss Ihr Benutzername "mit einem Kleinbuchstaben beginnen"
43Tesseracts

Antworten:

136

Einige Befehle (z. B. chown) können entweder einen Benutzernamen oder eine numerische Benutzer-ID akzeptieren. Wenn Sie also ausschließlich numerische Benutzernamen zulassen, wird dies verhindert.

Eine Regel, nach der Namen zugelassen werden, die mit einer Zahl beginnen und Alpha enthalten, hat sich wahrscheinlich nicht gelohnt. Stattdessen muss nur mit einem Buchstaben begonnen werden.

Bearbeiten:

Aus den anderen Antworten geht hervor, dass einige Distributoren diese Einschränkung aufgehoben haben. In diesem Fall laut der GNU Core Utils-Dokumentation :

Für POSIX ist es erforderlich, dass diese Befehle zuerst versuchen, die angegebene Zeichenfolge als Namen aufzulösen, und nur dann, wenn dies fehlschlägt, versuchen, sie als ID zu interpretieren.

$ useradd 1000   # on most systems this will fail with:
                 # useradd: invalid user name '1000'
$ mkdir /home/1000
$ chown -R 1000 /home/1000   # This will first try to map
    # to username "1000", but this may easily be misinterpreted.

Das Hinzufügen eines Benutzers mit dem Namen '0' würde nur zu Problemen führen (UID 0 == Root-Benutzer). Beachten Sie jedoch, dass Gruppen- / Benutzer-ID-Argumenten ein '+' vorangestellt werden kann, um ihre Interpretation als Ganzzahl zu erzwingen.

thomas_d_j
quelle
13
Dies ist der einzige Beitrag, der die Frage tatsächlich beantwortet. Sie sollten ein Beispiel hinzufügen , die Menschen zu zeigen , die auf Linux - Distributionen, die nicht die Gewohnheit haben, das Ergebnis der laufenden Upstream - Code zu verstümmeln useradd 253istuseradd: invalid user name '253'
don_crissti
2
Für die Aufzeichnung hier ist der Quellcode, wenn Sie ihn Ihrem Beitrag hinzufügen möchten.
don_crissti
5
Können Sie sich die Verwechslungsgefahr vorstellen, wenn der Benutzername 1000 die UID 253 hat? Oder im Allgemeinen für numerische Benutzernamen, die nicht mit der UID übereinstimmen? Natürlich nur für Gruppen.
Jonathan Leffler
5
Ich habe ein LDAP-System, bei dem einige Benutzer ihren (numerischen) Mitarbeitercode / ihre Registrierungsnummer als Benutzernamen haben. Ich habe schnell gelernt, auf Benutzer-IDs zu kanonisieren ( chown -R $(id -u $username) ...).
muru
2
Im Idealfall würde eine Benutzernamenzeichenfolge, ob Zahlen oder Buchstaben, einer UID zugeordnet, und die Namen werden immer nachgeschlagen, um die UID zu bestimmen. dann werde ich es als Ausweis behandeln '
Matt Warren
83

Hier ist ein Test auf Ubuntu 14.04 mit Zahlen:

root@ubuntu:~# useradd 232
root@ubuntu:~# mkdir /home/232
root@ubuntu:~# chown 232.232 /home/232
root@ubuntu:~# passwd 232
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully
root@ubuntu:~# login
c2 login: 232
Password: 
Welcome to Ubuntu 14.04.4 LTS (GNU/Linux 4.4.0-22-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

 System information disabled due to load higher than 2.0

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

0 packages can be updated.
0 updates are security updates.



The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.


$ 
$ whoami
232

und eine mit Unicode U + 1F600 - 😀

root@c2:~# useradd 😀
root@c2:~# mkdir /home/😀
root@c2:~# chown 😀.😀 /home/😀
root@c2:~# passwd 😀
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully
root@c2:~# login
c2 login: 😀
Password: 
Welcome to Ubuntu 14.04.4 LTS (GNU/Linux 4.4.0-22-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

 System information disabled due to load higher than 2.0

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

0 packages can be updated.
0 updates are security updates.



The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

$ whoami
😀

Dies ist wahrscheinlich die schlechteste Idee, die ich hatte:

root@c2:~# useradd '&#%^()!@~*?<>=|'
root@c2:~# passwd '&#%^()!@~*?<>=|'
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully
root@c2:~# mkdir '/home/&#%^()!@~*?<>=|'
root@c2:~# chown '&#%^()!@~*?<>=|.&#%^()!@~*?<>=|' '/home/&#%^()!@~*?<>=|'
root@c2:~# login
c2 login: &#%^()!@~*?<>=|     
Password: 
Welcome to Ubuntu 14.04.4 LTS (GNU/Linux 4.4.0-22-generic x86_64)
**** text removed ****
applicable law.

$ whoami
&#%^()!@~*?<>=|

Natürlich können Sie einen solchen Benutzer hinzufügen, obwohl ich nicht sicher bin, ob dies auf lange Sicht eine gute Idee ist.

Adonis
quelle
1
useradd '*'Das würde Spaß machen - cd /home/*/würde nicht wie erwartet funktionieren und wer weiß, wie andere Dienstprogramme reagieren würden, wenn sie den Wert von $HOMEfür diesen Benutzer verwenden.
Liam Dawson
9
wow ubuntu erlaubt das? Ich frage mich, was passiert, wenn Sie versuchen useradd 1000(vorausgesetzt, Sie haben bereits einen Benutzer mit UID 1000)
thomas_d_j
8
+1 nur für alle verbotenen Symbole!
EKons
3
Oh, ich kann mir Schlimmeres
vorstellen
4
@IsmaelMiguel: Ein Literal \0in / etc / passwd würde wahrscheinlich viele Programme zum Absturz bringen, die es analysieren. Aber wahrscheinlich konnte man mit Standardwerkzeugen gar keinen Benutzer mit diesem Namen hinzufügen. Systemaufrufe wie mkdir(2)auch verwenden Zeichenfolgen mit 0-Abschluss und impliziter Länge, sodass Sie keine erstellen können /home/\0/, da dieser Pfad gerecht ist /home.
Peter Cordes
9

Ein * Nix-Benutzername ist im Allgemeinen eine 32-stellige Zeichenfolge, die vom Dienstprogramm erstellt wurde useradd. Dies ist, wie Sie sagten, ein direktes Ergebnis früherer Unix-Standards (BSD-technisch). Laut der FreeBSD Man Page passwd(5):

Der Anmeldename darf nicht mit einem Bindestrich ("-") beginnen und darf keine 8-Bit-Zeichen, Tabulatoren oder Leerzeichen oder eines der folgenden Symbole enthalten: ",: + & #% ^ ()! @ ~ *? <> = | / "'. Das Dollarsymbol (` $') ist nur als letztes Zeichen zur Verwendung mit Samba zulässig. Kein Feld darf einen Doppelpunkt (`: ') enthalten, da dies in der Vergangenheit verwendet wurde, um die Felder im Benutzer zu trennen Datenbank.

Bestimmte * Nix-Systeme verursachten unklare Fehler, wenn Sonderzeichen in Benutzernamen angegeben wurden. Daher wurden die Sonderzeichen schließlich gesperrt. In den meisten modernen * Nix-Systemen wäre es relativ einfach, die passwd/ useraddutilities zu ändern , um Benutzernamen mit Sonderzeichen zu unterstützen, aber die meisten Leute zögern, so etwas Unwichtiges zu ändern, da es wenig Wirkung hätte und zu Inkompatibilitäten in der Rückwärtsrichtung führen würde.

EDIT:
Wie Adonis sagte, ist es in der Tat möglich, dies in einer modernen Linux-Distribution zu tun, es ist jedoch nicht ratsam (insbesondere, wenn standardisierte oder ältere Programme angetroffen werden).

Interessant...
quelle
5
Sicher, aber die Frage erwähnt nicht einmal Sonderzeichen. Es wird gefragt, warum Benutzernamen nicht mit Ziffern beginnen dürfen (die keine Sonderzeichen sind).
don_crissti
Sicher, @don_crissti, möchten Sie, dass ich erneut frage, warum ein Benutzername historisch gesehen nicht mit einem Leerzeichen beginnen kann, und dann separat frage, warum er historisch gesehen nicht mit jedem der Symbole beginnt, und dann frage, ob & c historisch mit einem $ endet? Diese "Antwort" passt nicht als Kommentar, was sie eindeutig ist, enthält jedoch nützliche Informationen in Bezug auf die Frage.
Frumbert
Was bedeutet das 8-Bit-Zeichen in diesem Absatz? IE: Sicherlich sind alle ASCII-Zeichen 8-Bit?
Matt Warren
feh! /etc/passwdist eine Textdatei. useradd? pish-tosh. Echte Sysadmins gebrauchen vi!
am
1
@MattWarren. ASCII ist eine 7-Bit-Codierung
fpmurphy
1

Gibt es einen technischen Grund dafür? Ist dies ein Artefakt aus den Anfängen von Linux oder Unix, und wenn ja, gibt es einen Grund, warum es so bleibt?

Ich kann mir keinen technischen Grund vorstellen - historisch gesehen ist es nur ASCII. Wie es eingelesen und dann getippt wird, liegt in den Händen des Programmierers.

unix-history-repo / usr / src / cmd / passwd.c

char *uname;

insist = 0;
if(argc < 2) {
    if ((uname = getlogin()) == NULL) {
        printf ("Usage: passwd user\n");
        goto bex;
    } else {
        printf("Changing password for %s\n", uname);
    }
} else {
    uname = argv[1];
}

Da ich einige Zeit damit verbracht habe, Archiv-Manpages zu durchsuchen (zum Beispiel: 1BSD war Bill Joys erste Berkeley-Softwareverteilung ), habe ich nichts gesehen, das Benutzernamen angibt. Das heißt nicht, dass es nicht existiert, aber ich habe es nicht gesehen.

Wir bleiben also im historischen menschlichen Kontext. Als ich 1980 mit dem Technischen angefangen habe, haben wir immer unseren richtigen Namen für die Anmeldung verwendet. Normalerweise Vor- und Nachname, es sei denn, es gab eine Längenbeschränkung. Dies war wichtig, da Ihr Anmeldename als E-Mail-Adresse verwendet wurde. Damals schickte niemand eine anonyme E-Mail. Natürlich muss es einige Ausnahmen gegeben haben, ich erinnere mich nicht daran. Insgesamt glaube ich jedoch, dass dies der Fall ist.

Und laut der rfc5321 # page-63 gibt es keine Einschränkung, dass ein E-Mail- "Name" mit einer Ziffer beginnt. Google Mail erstellt alle numerischen Benutzernamen. (Hol es dir jetzt, sie gehen schnell).

Wenn es also einen Code gibt, der einen Benutzernamen abweist, der mit [0-9] beginnt, dann ist er wahrscheinlich später entstanden, als sich ein Programmierer dachte: "Warum hätten Sie eine Nummer als Namen?". Ich muss noch einmal sagen, dass es möglicherweise einen historischen Unix-Code gibt, der einen Benutzernamen abweist, der mit einer Zahl beginnt. Ich habe es einfach nicht gesehen. Die frühen Passworttabellen wurden von Hand bearbeitet, ich erinnere mich sicher, dass ich das auch in den frühen 90ern oft getan habe.

Woher kommt das? Ich zitiere stroustrup, C ++ 11FAQ. Wann werden die neuen Standardbibliotheken verfügbar sein?

Denken Sie daran, dass es nicht möglich ist, ältere Features zu entfernen, auch wenn das Komitee dies für schlecht hält: Die Erfahrung zeigt, dass Benutzer jeden Implementierer dazu zwingen, weiterhin veraltete und gesperrte Features unter Kompatibilitätsschaltern (oder standardmäßig) bereitzustellen. für Jahrzehnte.

Jim
quelle
0

Wie in den Antworten darauf hingewiesen, Linux - Benutzernamen können all-numerisch sein. Dies ist jedoch eine schlechte Idee, da sie viele Softwaretools (und menschliche Systemadministratoren!) Verwirren würde.

Aus diesem Grund sind beispielsweise rein numerische Benutzernamen und Gruppennamen in RHEL 7 veraltet und in RHEL 8 verboten:

8.7.1. shadow-utilsAlle numerischen Benutzer- und Gruppennamen sind nicht mehr zulässig

Die Befehle useraddund groupaddverbieten Benutzer- und Gruppennamen, die nur aus numerischen Zeichen bestehen. Der Grund für das Nichtzulassen solcher Namen ist, dass dies möglicherweise viele Tools verwirren kann, die mit Benutzer- und Gruppennamen sowie Benutzer- und Gruppen-IDs (bei denen es sich um Zahlen handelt) arbeiten. Bitte beachten Sie, dass die rein numerischen Benutzer- und Gruppennamen in Red Hat Enterprise Linux 7 nicht mehr unterstützt werden und in Red Hat Enterprise Linux 8 nicht mehr unterstützt werden.

dr01
quelle
-2

Ich bin nicht sicher, ob ich es einen technischen Grund nennen würde, aber die Regel lautet: "Der Benutzername muss eine gültige Kennung für die Programmiersprache sein." Bezeichner haben aufgrund ihrer eingeschränkten Syntax einige nette Eigenschaften: Sie können nicht mit Zahlen verwechselt werden, selbst wenn Zeichen nach Zeichen gelesen werden, und sie müssen nicht in Anführungszeichen gesetzt werden, wenn ein Parser durchlaufen wird. Kurz gesagt, sie sind leicht als Namen zu erkennen, was den Programmieraufwand für die Arbeit mit ihnen verringert.

Ich bezweifle, dass es jemals wirklich notwendig war, Benutzernamen, die mit einer Ziffer beginnen, zu verbieten, aber "ein Benutzername muss ein Bezeichner sein" ist eine einfache Regel, die für 100% der frühen Unix-Benutzer unmissverständlich gewesen wäre.

Wenn der einzige Ort, an dem Sie Ihren Benutzernamen eingeben, die Anmeldeaufforderung in einer GUI ist, spielt es wahrscheinlich keine Rolle, welche Zeichen darin enthalten sind (Ausnahmen von Nullen und Dingen wie Zeilenumbrüchen, die selbst dem Anmeldevorgang Probleme bereiten würden). Wenn Sie jedoch viel über die Befehlszeile arbeiten, können Sie bequem einen Benutzernamen verwenden, mit dem Sie problemlos arbeiten können.

alexis
quelle
Humm, ein Login (Benutzername) hat absolut nichts mit einer Programmiersprachenidentifikation zu tun.
fpmurphy
Und doch ist die Definition eines gültigen Benutzernamen ist die gleiche wie für Bezeichner, das ist der Punkt.
Alexis