Perché i nomi utente Linux non possono iniziare con i numeri?


84

C'è un motivo tecnico per cui? È un artefatto dei primi tempi di Linux o Unix, e in tal caso esiste un motivo per cui persiste?


22
Dal momento che questo è stato sfatato nelle risposte, qual è la tua fonte per questa affermazione?
l0b0

19
@ l0b0 - per useradd(da shadow-utils 4.2.1) pagina di manuale (vedi 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, e solo perché una distro (famosa per questo tipo di cose) lo consente non significa "è stata sfatata nelle risposte" . La domanda è taggata linux, no ubuntu. Prova a farlo su archlinux .
don_crissti,

1
@don_crissti Chiaramente non si applica a tutte le distro Linux, quindi è stato interessante sapere da dove verrebbe quella restrizione.
l0b0

5
Anche Ubuntu se ne frega: quando si installa con Live CD / Ubiquity il nome utente "Deve iniziare con una lettera minuscola"
43Tesseracts

Risposte:


136

Alcuni comandi (ad es. chown) Possono accettare un nome utente o un ID utente numerico, quindi consentire nomi utente tutti numerici lo spezzerebbe.

Una regola per consentire nomi che iniziano con un numero e che contengono un po 'di alfa è stata probabilmente considerata non degna di sforzo; invece c'è solo un requisito per iniziare con un carattere alfa.

Modificare:

Dalle altre risposte risulta che alcune distro hanno sovvertito questa limitazione; in questo caso, secondo la documentazione di GNU Core Utils :

POSIX richiede che questi comandi prima provino a risolvere la stringa specificata come nome e solo una volta che fallisce, quindi provano a interpretarla come un 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.

L'aggiunta di un utente chiamato "0" richiederebbe solo problemi (UID 0 == utente root). Tuttavia, si noti che gli argomenti ID gruppo / utente possono essere preceduti da un '+' per forzare la loro interpretazione come numero intero.


13
Questo è l'unico post che in realtà risponde alla domanda. Dovresti aggiungere un esempio per mostrare alle persone che su distro linux che non hanno l'abitudine di mutilare il codice a monte il risultato dell'esecuzione useradd 253èuseradd: invalid user name '253'
don_crissti

2
Per la cronaca qui è il codice sorgente se si desidera aggiungerlo al tuo post.
don_crissti,

5
Riesci a immaginare le opportunità di confusione se il nome utente 1000 ha UID 253? O, in generale, per nomi utente numerici che non corrispondono all'UID? Similmente con i gruppi, ovviamente.
Jonathan Leffler,

5
Ho un sistema LDAP in cui alcuni utenti hanno il loro codice (numerico) dipendente / numero di registrazione come nome utente. Ho imparato rapidamente a canonicalizzare agli ID utente ( chown -R $(id -u $username) ...).
Muru,

2
idealmente una stringa di nome utente, sia essa numeri o lettere, sarebbe mappata su un UID e i nomi cercavano sempre di determinare l'UID, al contrario del pigro 'questo nome è fatto di numeri? poi lo tratterò come un documento d'identità '
Matt Warren,

83

ecco un test su Ubuntu 14.04 usando i numeri:

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

e uno che usa 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
😀

Questa è probabilmente la peggior idea che ho avuto:

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

Chiaramente puoi aggiungere un tale utente, anche se non sono sicuro che questa sia una buona idea a lungo termine.


1
useradd '*'sarebbe divertente - cd /home/*/non funzionerebbe come previsto e chissà come reagirebbero le altre utility quando si utilizza il valore di $HOMEper quell'utente.
Liam Dawson,

9
wow ubuntu lo permette? Mi chiedo cosa succede se provi useradd 1000(supponendo che tu abbia già un utente con UID 1000)
thomas_d_j

8
+1 solo per tutti i simboli proibiti!
EKons,

3
Oh, posso pensare al peggio ...
OrangeDog,

4
@IsmaelMiguel: un letterale \0in / etc / passwd probabilmente spezzerebbe molti programmi che lo analizzano. Ma probabilmente non è possibile aggiungere un utente con quel nome in primo luogo, utilizzando strumenti standard. Le chiamate di sistema come mkdir(2)usano anche stringhe di lunghezza implicita con terminazione 0, quindi non è possibile creare /home/\0/, perché quel percorso è giusto /home.
Peter Cordes,

9

Un nome utente * Nix è generalmente una stringa lunga 32 caratteri creata dall'utilità useradd. Questo è, come hai detto, un risultato diretto dei primi standard Unix (tecnicamente BSD). Secondo la pagina man di FreeBSD passwd(5):

Il nome di accesso non deve iniziare con un trattino (`- ') e non può contenere caratteri, schede o spazi a 8 bit o uno di questi simboli:`,: + & #% ^ ()! @ ~ *? <> = | / "'. Il simbolo del dollaro (` $') è consentito solo come ultimo carattere da utilizzare con Samba. Nessun campo può contenere due punti (`: ') poiché è stato usato storicamente per separare i campi dell'utente Banca dati.

Alcuni sistemi * Nix erano soliti lanciare errori oscuri quando venivano presentati caratteri speciali nei nomi utente, quindi alla fine i caratteri speciali sono stati vietati. Nella maggior parte dei moderni sistemi * Nix sarebbe relativamente facile cambiare le passwd/ useraddutility per supportare nomi utente di caratteri speciali, ma la maggior parte delle persone è riluttante a cambiare una cosa così poco importante, poiché avrebbe scarso effetto e causerebbe incompatibilità all'indietro.

EDIT:
Come ha detto Adonis, è infatti possibile farlo in una moderna distribuzione Linux, tuttavia è sconsigliato (specialmente quando si incontrano programmi standardizzati o legacy).


5
Certo, ma la domanda non menziona nemmeno i personaggi speciali. Si chiede perché i nomi utente non possano iniziare con cifre (che non sono caratteri speciali).
don_crissti,

Certo @don_crissti, preferiresti che mi chieda nuovamente perché storicamente un nome utente non può iniziare con uno spazio, quindi chiedere separatamente perché storicamente non inizia con ciascuno dei simboli, quindi chiedere & c termina storicamente con un $? Questa "risposta" non si adatta come un commento, che è chiaramente, ma contiene informazioni utili relative alla domanda.
frumbert,

Cosa si intende per carattere a 8 bit in quel paragrafo? IE: Sicuramente tutti i caratteri ASCII sono a 8 bit?
Matt Warren,

feh! /etc/passwdè un file di testo. useradd? Pish-tosh. I veri amministratori di sistema usano vi!
apposto il

1
@MattWarren. ASCII è una codifica a 7 bit
fpmurphy

1

C'è un motivo tecnico per cui? È un artefatto dei primi tempi di Linux o Unix, e in tal caso esiste un motivo per cui persiste?

Non riesco a pensare a una ragione tecnica - storicamente, è solo ASCII. Il modo in cui viene letto e poi digitato è nelle mani del programmatore.

unix-storia-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 quando ho trascorso un po 'di tempo a sfogliare le pagine man dell'archivio (ad esempio: 1BSD è stata la prima distribuzione software Berkeley di Bill Joy ), non ho visto nulla che specifica i nomi degli utenti. Questo non vuol dire che non esiste, ma non l'ho visto.

Quindi siamo rimasti con il contesto umano storico. Quando ho iniziato a lavorare nel settore tecnologico nel 1980, abbiamo sempre usato il nostro vero nome per gli accessi. Di solito il primo nome iniziale e il cognome completo a meno che non ci fosse un limite di lunghezza. Questo è stato importante poiché il tuo nome di accesso è stato utilizzato come indirizzo e-mail. Nessuno di allora ha inviato e-mail anonime. Ovviamente ci sono state delle eccezioni, non le ricordo. Nel complesso, tuttavia, credo che questo sia il caso.

E secondo rfc5321 # page-63, non ci sono restrizioni per avere un "nome" e-mail che inizi con un numero. gmail creerà tutti i nomi utente numerici. (prendilo ora, stanno andando veloce).

Quindi, se esiste un codice che rifiuta un nome utente che inizia con [0-9], probabilmente è nato dopo con un programmatore che pensa "perché dovresti avere un numero come nome?". Ancora una volta, devo dire che potrebbe benissimo esserci un codice unix storico che ha rifiutato un nome utente che inizia con un numero. Non l'ho visto. Le prime tabelle delle password sono state modificate a mano, certamente ricordo di averlo fatto spesso, anche agli inizi degli anni '90.

Per quanto riguarda il motivo per cui persiste, citerò stroustrup, C ++ 11FAQ, quando saranno disponibili le nuove librerie standard?

Per rendere il problema più difficile, ricorda che non è possibile eliminare le funzionalità più vecchie, anche se il comitato concorda sul fatto che sono cattive: l'esperienza mostra che gli utenti costringono ogni implementatore a continuare a fornire funzionalità obsolete e vietate sotto switch di compatibilità (o per impostazione predefinita) per decenni.


0

Come sottolineato nelle risposte, i nomi utente di Linux possono essere tutti numerici. Tuttavia, questa è una cattiva idea in quanto confonderebbe molti strumenti software (e amministratori di sistema umani!).

Per questo motivo, ad esempio, nomi utente e nomi di gruppo tutti numerici sono deprecati in RHEL 7 e vietati in RHEL 8:

8.7.1. shadow-utilsnon consente più nomi di utenti e gruppi tutti numerici

I comandi useradde groupaddnon consentono nomi utente e di gruppo costituiti esclusivamente da caratteri numerici. La ragione per non consentire tali nomi è che ciò può confondere potenzialmente molti strumenti che funzionano con nomi di utenti e gruppi e ID di utenti e gruppi (che sono numeri). Si noti che i nomi utente e di gruppo tutti numerici sono obsoleti in Red Hat Enterprise Linux 7 e il loro supporto è stato completamente rimosso in Red Hat Enterprise Linux 8.


-2

Non sono sicuro che lo definirei un motivo tecnico, ma la regola si riduce a "il nome utente deve essere un identificatore del linguaggio di programmazione valido". Gli identificatori hanno alcune belle proprietà a causa della loro sintassi limitata: non possono essere scambiati per numeri, anche quando leggono caratteri per carattere e non devono essere citati quando si passa attraverso un parser. In breve, sono facilmente riconoscibili come nomi, il che riduce il lavoro di programmazione necessario per lavorare con loro.

Dubito che sia mai stato davvero necessario vietare nomi utente che iniziano con una cifra, ma "un nome utente deve essere un identificatore" è una semplice regola che sarebbe stata cristallina per il 100% dei primi utenti Unix.

Se l'unico posto in cui digiti il ​​tuo nome utente è al prompt di accesso in una GUI, probabilmente non fa differenza quali caratteri include (esonerando null e cose come newline, che darebbero anche il singhiozzo alla procedura di accesso). Ma se fai molto lavoro dalla riga di comando, la comodità di avere un nome utente con cui è facile lavorare.


Humm, un login (nome utente) non ha assolutamente nulla a che fare con un identificatore del linguaggio di programmazione.
fpmurphy,

Eppure la definizione di un nome utente valido è la stessa degli identificatori, questo è il punto.
alexis,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.