Pourquoi les noms d'utilisateur Linux ne peuvent-ils pas commencer par des nombres?

84

Y a-t-il une raison technique? S'agit-il d'un artefact des débuts de Linux ou d'Unix, et si oui, y a-t-il une raison pour laquelle il persiste?

43Tesseracts
la source
22
Depuis que cela a été démystifié dans les réponses, quelle est votre source pour cette déclaration?
l0b0
19
@ l0b0 - par useradd(à partir de shadow-utils 4.2.1) page de manuel (voir CAVEATS ):Usernames must start with a lower case letter or an underscore [...] In regular expression terms: [a-z_][a-z0-9_-]*[$]?
don_crissti
30
@ 10b0 - oh, et juste parce qu'une distribution (célèbre pour ce genre de choses) le permet, ça ne veut pas dire "ça a été démystifié dans les réponses" . La question est étiquetée linux, pas ubuntu. Essayez de le faire sur archlinux .
don_crissti
1
@don_crissti Cela ne s'applique évidemment pas à toutes les distributions Linux et il était donc intéressant de savoir d'où proviendrait cette restriction.
l0b0
5
Même Ubuntu s'en soucie: lorsque vous installez avec le Live CD / Ubiquity votre nom d'utilisateur "Doit commencer par une lettre minuscule"
43Tesseracts

Réponses:

136

Certaines commandes (par exemple chown) peuvent accepter un nom d'utilisateur ou un identifiant d'utilisateur numérique. Autoriser des noms d'utilisateur entièrement numériques annulerait cette opération.

Une règle autorisant les noms commençant par un nombre et contenant un alpha était probablement considérée comme un effort inutile. au lieu de cela, il suffit simplement de commencer par un caractère alpha.

Modifier:

Il ressort des autres réponses que certaines distributions ont subverti cette limitation; dans ce cas, selon la documentation de GNU Core Utils :

POSIX exige que ces commandes tentent d'abord de résoudre la chaîne spécifiée sous forme de nom et qu'une seule fois après l'échec, puis tentez de l'interpréter en tant qu'ID.

$ 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.

Ajouter un utilisateur nommé "0" ne ferait que poser problème (UID 0 == utilisateur root). Toutefois, notez que les arguments ID de groupe / utilisateur peuvent être précédés d'un '+' pour forcer leur interprétation sous forme d'entier.

thomas_d_j
la source
13
C'est le seul message qui répond réellement à la question. Vous devriez ajouter un exemple pour montrer aux gens que sur les distributions Linux qui n'ont pas l'habitude de mutiler le code en amont, le résultat de l'exécution useradd 253estuseradd: invalid user name '253'
don_crissti
2
Pour mémoire, voici le code source si vous souhaitez l’ajouter à votre message.
don_crissti
5
Pouvez-vous imaginer les risques de confusion si le nom d'utilisateur 1000 a l'UID 253? Ou, en général, pour les noms d'utilisateur numériques qui ne correspondent pas à l'UID? Simlarly avec des groupes, bien sûr.
Jonathan Leffler
5
J'ai un système LDAP dans lequel certains utilisateurs ont comme code d'utilisateur leur numéro d'employé / numéro d'employé (numérique). J'ai rapidement appris à canoniser en identifiant utilisateur ( chown -R $(id -u $username) ...).
Muru
2
idéalement, une chaîne de nom d'utilisateur, qu'il s'agisse de chiffres ou de lettres, serait mappée à un UID et les noms étaient toujours recherchés pour déterminer l'UID, par opposition au paresseux. Ce nom est-il composé de chiffres? alors je le traiterai comme une pièce d'identité '
Matt Warren
83

voici un test sur Ubuntu 14.04 en utilisant des nombres:

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

et un utilisant 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
😀

C'est probablement la pire idée que j'ai eue:

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
&#%^()!@~*?<>=|

Il est clair que vous pouvez ajouter un tel utilisateur, même si je ne suis pas sûr que ce soit une bonne idée à long terme.

Adonis
la source
1
useradd '*'serait amusant - cd /home/*/ne fonctionnerait pas comme prévu, et qui sait comment les autres utilitaires réagiraient en utilisant la valeur de $HOMEpour cet utilisateur.
Liam Dawson
9
wow Ubuntu permet cela? Je me demande ce qui se passe si vous essayez useradd 1000(en supposant que vous avez déjà un utilisateur avec l'UID 1000)
thomas_d_j
8
+1 pour tous les symboles interdits!
EKons
3
Oh, je peux penser au pire ...
OrangeDog
4
@IsmaelMiguel: Un littéral \0dans / etc / passwd briserait probablement beaucoup de programmes qui l'analysent. Mais vous n'avez probablement pas pu ajouter un utilisateur portant ce nom en utilisant des outils standard. Les appels système tels que mkdir(2)utilisent également des chaînes de longueur implicite à terminaison 0, vous ne pouvez donc pas créer /home/\0/, car ce chemin est juste /home.
Peter Cordes
9

Un nom d'utilisateur * Nix est généralement une chaîne de 32 caractères créée par l'utilitaire useradd. Comme vous l'avez dit, c'est le résultat direct des premiers standards Unix (techniquement BSD). Selon la page de manuel FreeBSD passwd(5):

Le nom de connexion ne doit pas commencer par un trait d'union (`- ') et ne doit pas contenir de caractères, tabulations ou espaces de 8 bits, ni aucun de ces symboles:`,: + & #% ^ ()! @ ~ *? <> = | / "'. Le symbole dollar (" $ ") est autorisé uniquement en tant que dernier caractère à utiliser avec Samba. Aucun champ ne peut contenir deux points (": ") car il a été utilisé historiquement pour séparer les champs de l'utilisateur. base de données.

Certains systèmes * Nix avaient l'habitude de générer des erreurs obscures lorsqu'ils étaient présentés avec des caractères spéciaux dans les noms d'utilisateur. Les caractères spéciaux ont donc finalement été bannis. Dans la plupart des systèmes * Nix modernes, il serait relativement facile de changer les utilitaires passwd/ useraddafin de prendre en charge les noms d’utilisateur des caractères spéciaux, mais la plupart des gens hésitent à changer une chose aussi peu importante, car cela aurait peu d’effet et causerait une incompatibilité avec les versions antérieures.

EDIT:
Comme Adonis l’a dit, il est en fait possible de le faire dans une distribution Linux moderne, mais cela n’est pas conseillé (en particulier lorsque vous rencontrez des programmes standard ou hérités).

Intéressant...
la source
5
Bien sûr, mais la question ne mentionne même pas les caractères spéciaux. Il demande pourquoi les noms d'utilisateur ne peuvent pas commencer par des chiffres (qui ne sont pas des caractères spéciaux).
don_crissti
Bien sûr, @don_crissti, préféreriez-vous que je demande de nouveau pourquoi, historiquement, un nom d'utilisateur ne peut pas commencer par un espace, puis demandez séparément pourquoi il ne commence pas par chacun des symboles, puis par & c se termine par un $? Cette "réponse" ne correspond pas à un commentaire, ce qui est clairement le cas, mais contient des informations utiles relatives à la question.
Frumbert
Qu'entend-on par caractère 8 bits dans ce paragraphe? IE: Tous les caractères ascii sont-ils en 8 bits?
Matt Warren
feh! /etc/passwdest un fichier texte. useradd? pish-tosh. Les vrais administrateurs utilisent vi!
infixée le
1
@ MattWarren. ASCII est un encodage 7 bits
fpmurphy
1

Y a-t-il une raison technique? S'agit-il d'un artefact des débuts de Linux ou d'Unix, et si oui, y a-t-il une raison pour laquelle il persiste?

Je ne peux pas penser à une raison technique - historiquement, c'est juste ASCII. La manière dont il est lu puis dactylographié est entre les mains du codeur.

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];
}

Depuis que j'ai passé un certain temps à parcourir les pages de manuel des archives (par exemple: 1BSD a été la première distribution de logiciels de Berkeley par Bill Joy ), je n’ai rien vu qui spécifie les noms d’utilisateur. Cela ne veut pas dire qu'il n'existe pas, mais je ne l'ai pas vu.

Nous nous retrouvons donc avec un contexte humain historique. À mes débuts dans la technologie en 1980, nous utilisions toujours notre vrai nom pour les connexions. Habituellement, le prénom initial et le nom complet, à moins d’une limite de longueur. C'était important car votre nom d'utilisateur a été utilisé comme adresse électronique. À l'époque, personne n'a envoyé d'e-mail anonyme. Bien sûr, il doit y avoir quelques exceptions, je ne les rappelle pas. Dans l’ensemble cependant, je crois que tel est le cas.

Et selon le rfc5321 # page-63, il n’existe aucune restriction quant à l’envoi d’un "nom" par courrier électronique commençant par un chiffre. gmail créera tous les noms d'utilisateur numériques. (l'obtenir maintenant, ils vont vite).

Donc, si un code rejette un nom d'utilisateur commençant par [0-9], il a probablement été créé plus tard avec un programmeur se demandant "pourquoi voudriez-vous avoir un numéro comme nom?". Encore une fois, je dois dire qu'il peut très bien exister un code historique Unix qui a rejeté un nom d'utilisateur commençant par un nombre. Je ne l'ai juste pas vu. Les premiers tableaux de mots de passe ont été modifiés à la main, je me souviens certainement de le faire fréquemment, même au début des années 90.

Pour ce qui est de la persistance, je citerai stroustrup, C ++ 11FAQ, Quand les nouvelles bibliothèques standard seront-elles disponibles?

Pour rendre le problème plus difficile, rappelez-vous qu’il n’est pas faisable d’éliminer les anciennes fonctionnalités, même si le comité convient qu’elles sont mauvaises: l’expérience montre que les utilisateurs forcent chaque développeur à continuer à fournir des fonctionnalités obsolètes et interdites sous des commutateurs de compatibilité (ou par défaut). depuis des décennies.

Jim
la source
0

Comme indiqué dans les réponses, les noms d'utilisateur Linux peuvent être entièrement numériques. Cependant, c'est une mauvaise idée car cela confondre de nombreux outils logiciels (et des administrateurs systèmes humains!).

Pour cette raison, par exemple, les noms d'utilisateur et noms de groupe entièrement numériques sont obsolètes dans RHEL 7 et interdits dans RHEL 8:

8.7.1. shadow-utilsn'autorise plus les noms d'utilisateur et de groupe entièrement numériques

Les commandes useraddet groupaddinterdisent les noms d'utilisateurs et de groupes composés uniquement de caractères numériques. La raison pour laquelle de tels noms ne sont pas autorisés est que cela peut dérouter de nombreux outils fonctionnant avec les noms d'utilisateur et de groupe et les identifiants d'utilisateur et de groupe (qui sont des nombres). Veuillez noter que les noms d'utilisateur et de groupe entièrement numériques sont obsolètes dans Red Hat Enterprise Linux 7 et que leur support est complètement supprimé dans Red Hat Enterprise Linux 8.

dr01
la source
-2

Je ne suis pas sûr que j'appellerais cela une raison technique, mais la règle se résume à "le nom d'utilisateur doit être un identificateur de langage de programmation valide". Les identifiants ont quelques propriétés intéressantes du fait de leur syntaxe restreinte: ils ne peuvent pas être confondus avec des nombres, même lors de la lecture caractère par caractère, et il n'est pas nécessaire de les citer lors du passage à un analyseur. En bref, ils sont facilement reconnus comme des noms, ce qui réduit le travail de programmation nécessaire pour travailler avec eux.

Je doute qu'il ait jamais été vraiment nécessaire d'interdire les noms d'utilisateurs commençant par un chiffre, mais "un nom d'utilisateur doit être un identifiant" est une règle simple qui aurait été parfaitement claire pour 100% des utilisateurs Unix les plus anciens.

Si le seul endroit où vous tapez votre nom d'utilisateur se trouve à l'invite de connexion dans une interface graphique, les caractères qu'il contient ne font probablement aucune différence (exonérant les valeurs NULL et les choses comme les nouvelles lignes, ce qui donnerait le hoquet à la procédure de connexion). Mais si vous travaillez beaucoup depuis la ligne de commande, vous aurez un nom d’utilisateur facile à utiliser.

alexis
la source
Humm, un login (nom d'utilisateur) n'a absolument rien à voir avec un identifiant de langage de programmation.
fpmurphy
Et pourtant, la définition d’un nom d’utilisateur valide est la même que pour les identificateurs, c’est l’essentiel.
alexis