¿Por qué los nombres de usuario de Linux no pueden comenzar con números?

84

¿Hay alguna razón técnica por qué? ¿Es esto un artefacto de los primeros días de Linux o Unix, y si es así, hay una razón por la que persiste?

43 Tesseracts
fuente
22
Dado que esto fue desacreditado en las respuestas, ¿cuál es su fuente para esta declaración?
l0b0
19
@ l0b0 - por useradd(desde shadow-utils 4.2.1) la página del manual (ver 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, y solo porque una distribución (famosa por este tipo de cosas) lo permite no significa "fue desacreditado en las respuestas" . La pregunta está etiquetada linux, no ubuntu. Intenta hacerlo en archlinux .
don_crissti
1
@don_crissti Claramente no se aplica a todas las distribuciones de Linux, y por lo tanto fue interesante saber de dónde vendría esa restricción.
l0b0
55
Incluso a Ubuntu le importa: cuando instala con Live CD / Ubiquity su nombre de usuario "debe comenzar con una letra minúscula"
43Tesseracts

Respuestas:

136

Algunos comandos (p chown. Ej. ) Pueden aceptar un nombre de usuario o una ID de usuario numérica, por lo que permitir nombres de usuario totalmente numéricos lo rompería.

Probablemente se consideró que una regla para permitir nombres que comiencen con un número y contengan algo de alfa no merece la pena; en cambio, solo hay un requisito para comenzar con un carácter alfa.

Editar:

De las otras respuestas parece que algunas distribuciones han subvertido esta limitación; en este caso, de acuerdo con la documentación de GNU Core Utils :

POSIX requiere que estos comandos primero intenten resolver la cadena especificada como un nombre, y solo una vez que falle, luego intenten interpretarla como una 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.

Agregar un usuario llamado '0' solo estaría pidiendo problemas (UID 0 == usuario raíz). Sin embargo, tenga en cuenta que los argumentos de ID de grupo / usuario pueden ir precedidos de un '+' para forzar su interpretación como un entero.

thomas_d_j
fuente
13
Esta es la única publicación que realmente responde la pregunta. Debería agregar un ejemplo para mostrar a las personas que en las distribuciones de Linux que no tienen la costumbre de mutilar el código ascendente, el resultado de la ejecución useradd 253esuseradd: invalid user name '253'
don_crissti
2
Para el registro aquí está el código fuente si desea agregarlo a su publicación.
don_crissti
55
¿Te imaginas las oportunidades de confusión si el nombre de usuario 1000 tiene UID 253? ¿O, en general, para nombres de usuario numéricos que no coinciden con el UID? De manera similar con grupos, por supuesto.
Jonathan Leffler
55
Tengo un sistema LDAP donde algunos usuarios tienen su código (numérico) de empleado / número de registro como nombre de usuario. Rápidamente aprendí a canonizar a las ID de usuario ( chown -R $(id -u $username) ...).
muru
2
idealmente, una cadena de nombre de usuario, ya sean números o letras, se correlacionaría con un UID y los nombres siempre se buscarían para determinar el UID, en lugar del perezoso '¿este nombre está hecho de números? entonces lo trataré como una identificación '
Matt Warren
83

Aquí hay una prueba en Ubuntu 14.04 usando números:

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

y uno usando 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
😀

Esta es probablemente la peor idea que tuve:

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

Claramente, puede agregar dicho usuario, aunque no estoy seguro de que sea una buena idea a largo plazo.

Adonis
fuente
1
useradd '*'sería divertido, cd /home/*/no funcionaría como se esperaba, y quién sabe cómo reaccionarían otras utilidades al usar el valor de $HOMEese usuario.
Liam Dawson
99
wow ubuntu lo permite? Me pregunto qué pasa si lo intentas useradd 1000(suponiendo que ya tienes un usuario con UID 1000)
thomas_d_j
8
¡+1 solo para todos los símbolos prohibidos!
EKons
3
Oh, puedo pensar en algo peor ...
OrangeDog
44
@IsmaelMiguel: un literal \0en / etc / passwd probablemente rompería muchos programas que lo analizan. Pero probablemente no podría agregar un usuario con ese nombre en primer lugar, utilizando herramientas estándar. Las llamadas al sistema mkdir(2)también usan cadenas de longitud implícita terminadas en 0, por lo que no puede crear /home/\0/, porque esa ruta es justa /home.
Peter Cordes
9

Un nombre de usuario * Nix es generalmente una cadena larga de 32 caracteres creada por la utilidad useradd. Esto es, como usted dijo, un resultado directo de los primeros estándares de Unix (técnicamente BSD). De acuerdo con la página de manual de FreeBSD passwd(5):

El nombre de inicio de sesión no debe comenzar con un guión (`- '), y no puede contener caracteres de 8 bits, tabulaciones o espacios, ni ninguno de estos símbolos:`,: + & #% ^ ()! @ ~ *? <> = | / "'. El símbolo de dólar (` $') se permite solo como el último carácter para usar con Samba. Ningún campo puede contener dos puntos (`: ') ya que esto se ha usado históricamente para separar los campos en el usuario base de datos.

Ciertos sistemas * Nix solían arrojar errores oscuros cuando se presentaban caracteres especiales en los nombres de usuario, por lo que eventualmente, los caracteres especiales fueron prohibidos. En la mayoría de los sistemas * Nix modernos, sería relativamente fácil cambiar las passwd/ useraddutilidades para admitir nombres de usuario de caracteres especiales, pero la mayoría de las personas dudan en cambiar algo tan poco importante, ya que tendría poco efecto y causaría incompatibilidad hacia atrás.

EDITAR:
como dijo Adonis, de hecho es posible hacer esto en una distribución moderna de Linux, sin embargo, no es aconsejable (especialmente cuando se encuentra con programas estandarizados o heredados).

Interesante...
fuente
55
Claro, pero la pregunta ni siquiera menciona caracteres especiales. Pregunta por qué los nombres de usuario no pueden comenzar con dígitos (que no son caracteres especiales).
don_crissti
Claro @don_crissti, ¿preferiría que vuelva a preguntar por qué históricamente un nombre de usuario no puede comenzar con un espacio, luego pregunte por separado por qué históricamente no comienza con cada uno de los símbolos, luego pregunte & c históricamente termina con un $? Esta "respuesta" no cabe como un comentario, que claramente lo es, pero contiene información útil relacionada con la pregunta.
frumbert
¿Qué se entiende por carácter de 8 bits en ese párrafo? IE: ¿Seguramente hay caracteres ascii de 8 bits?
Matt Warren
feh! /etc/passwdes un archivo de texto useradd? pish-tosh Uso real de los administradores de sistemas vi!
infijo
1
@MattWarren. ASCII es una codificación de 7 bits
fpmurphy
1

¿Hay alguna razón técnica por qué? ¿Es esto un artefacto de los primeros días de Linux o Unix, y si es así, hay una razón por la que persiste?

No puedo pensar en una razón técnica: históricamente, es solo ASCII. Cómo se lee y luego se escribe está en manos del codificador.

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

Como pasé algún tiempo navegando por las páginas de manual del archivo (por ejemplo: 1BSD fue la primera distribución de software de Berkeley de Bill Joy ), no he visto nada que especifique los nombres de usuario. Eso no quiere decir que no exista, pero no lo he visto.

Entonces nos quedamos con el contexto humano histórico. Cuando comencé en tecnología en 1980, siempre usábamos nuestro nombre real para los inicios de sesión. Por lo general, la primera inicial y el apellido completo a menos que haya algún límite de longitud. Esto fue importante ya que su nombre de usuario se utilizó como su dirección de correo electrónico. Nadie en ese entonces envió un correo electrónico anónimo. Por supuesto, debe haber algunas excepciones, no las recuerdo. En general, creo que este es el caso.

Y de acuerdo con el rfc5321 # page-63, no hay ninguna restricción para que un "nombre" de correo electrónico comience con un número. gmail creará todos los nombres de usuario numéricos. (Consíguelo ahora, van rápido).

Entonces, si hay algún código que rechaza un nombre de usuario que comienza con [0-9], entonces probablemente surgió más tarde con algún programador pensando "¿por qué tendrías un número como nombre?". Una vez más, debo decir que puede haber un código histórico de Unix que rechaza un nombre de usuario que comienza con un número. Simplemente no lo he visto. Las primeras tablas de contraseñas fueron editadas a mano, ciertamente recuerdo haberlo hecho con frecuencia, incluso a principios de los 90.

En cuanto a por qué persiste, citaré stroustrup, C ++ 11FAQ, ¿ Cuándo estarán disponibles las nuevas bibliotecas estándar?

Para hacer que el problema sea más difícil, recuerde que no es factible eliminar las funciones antiguas, incluso si el comité acepta que son malas: la experiencia muestra que los usuarios obligan a todos los implementadores a seguir proporcionando funciones obsoletas y prohibidas bajo los interruptores de compatibilidad (o por defecto) por décadas.

Jim
fuente
0

Como se señaló en las respuestas, los nombres de usuario de Linux pueden ser totalmente numéricos. Sin embargo, esta es una mala idea, ya que confundiría muchas herramientas de software (¡y administradores de sistemas humanos!).

Por esta razón, por ejemplo, los nombres de usuario y los nombres de grupo totalmente numéricos están en desuso en RHEL 7 y están prohibidos en RHEL 8:

8.7.1. shadow-utilsya no permite nombres de usuarios y grupos totalmente numéricos

Los comandos useraddy groupaddno permiten los nombres de usuarios y grupos que consisten únicamente en caracteres numéricos. La razón para no permitir dichos nombres es que esto puede confundir potencialmente muchas herramientas que funcionan con los nombres de usuarios y grupos y los identificadores de usuario y grupo (que son números). Tenga en cuenta que los nombres de usuarios y grupos totalmente numéricos están en desuso en Red Hat Enterprise Linux 7 y su compatibilidad se elimina por completo en Red Hat Enterprise Linux 8.

dr01
fuente
-2

No estoy seguro de llamarlo una razón técnica, pero la regla se reduce a "el nombre de usuario debe ser un identificador de lenguaje de programación válido". Los identificadores tienen algunas propiedades agradables debido a su sintaxis restringida: no pueden confundirse con números, incluso cuando leen caracteres por caracteres, y no necesitan ser citados al pasar por un analizador sintáctico. En resumen, se reconocen fácilmente como nombres, lo que reduce el trabajo de programación necesario para trabajar con ellos.

Dudo que alguna vez fuera realmente necesario no permitir nombres de usuario que comiencen con un dígito, pero "un nombre de usuario debe ser un identificador" es una regla simple que habría sido clara para el 100% de los primeros usuarios de Unix.

Si el único lugar donde escribe su nombre de usuario es en el indicador de inicio de sesión en una GUI, probablemente no importa qué caracteres incluya (excluyendo nulos y cosas como líneas nuevas, lo que daría incluso hipo al procedimiento de inicio de sesión). Pero si hace mucho trabajo desde la línea de comandos, la conveniencia de tener un nombre de usuario con el que sea fácil trabajar.

alexis
fuente
Humm, un inicio de sesión (nombre de usuario) no tiene absolutamente nada que ver con un identificador de lenguaje de programación.
fpmurphy
Y, sin embargo, la definición de un nombre de usuario válido es la misma que para los identificadores, ese es el punto.
alexis