Por que os nomes de usuário do Linux não podem começar com números?


84

Existe uma razão técnica para isso? Esse é um artefato dos primórdios do Linux ou Unix e, se houver, existe uma razão pela qual persiste?


22
Como isso foi desmascarado nas respostas, qual é a sua fonte para esta declaração?
L0b0

19
@ l0b0 - por useradd(a partir de shadow-utils 4.2.1) página manual (ver Oposições ):Usernames must start with a lower case letter or an underscore [...] In regular expression terms: [a-z_][a-z0-9_-]*[$]?
don_crissti

30
@ l0b0 - ah, e só porque uma distribuição (famosa por esse tipo de coisa) permite que isso não signifique "foi desmascarada nas respostas" . A pergunta está marcada linux, não ubuntu. Tente fazê-lo no archlinux .
31516 Don_crissti

11
@don_crissti Claramente não se aplica a todas as distribuições Linux e , portanto, era interessante saber de onde viria essa restrição.
l0b0

5
Mesmo Ubuntu se importa: quando você instalar com o CD / Ubiquity ao vivo seu nome de usuário "Deve começar com uma letra minúscula"
43Tesseracts

Respostas:


136

Alguns comandos (por exemplo chown) podem aceitar um nome de usuário ou um ID de usuário numérico, portanto, permitir nomes de usuário com todos os números quebraria isso.

Uma regra para permitir nomes que começam com um número e contêm algum alfa provavelmente não foi considerada valiosa; em vez disso, há apenas um requisito para começar com um caractere alfa.

Editar:

Das outras respostas, parece que algumas distros subverteram essa limitação; neste caso, de acordo com a documentação do GNU Core Utils :

O POSIX exige que esses comandos primeiro tentem resolver a cadeia especificada como um nome e, apenas uma vez que isso falhe, tente interpretá-la como um 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.

A adição de um usuário chamado '0' estaria apenas causando problemas (UID 0 == usuário root). No entanto, observe que os argumentos do grupo / ID do usuário podem ser precedidos por um '+' para forçar sua interpretação como um número inteiro.


13
Este é o único post que realmente responde à pergunta. Você deve adicionar um exemplo para mostrar às pessoas que em distribuições Linux que não têm o hábito de mutilar código a montante o resultado da execução useradd 253éuseradd: invalid user name '253'
don_crissti

2
Para o registro, aqui está o código-fonte, se você quiser adicioná-lo à sua postagem.
22864 Don_crissti

5
Você pode imaginar as oportunidades de confusão se o nome de usuário 1000 tiver UID 253? Ou, em geral, para nomes de usuário numéricos que não correspondem ao UID? De forma semelhante aos grupos, é claro.
Jonathan Leffler

5
Eu tenho um sistema LDAP no qual alguns usuários têm seu código / número de registro (numérico) de funcionário como nome de usuário. Eu aprendi rapidamente a canonizar para IDs de usuário ( chown -R $(id -u $username) ...).
Muru

2
idealmente, uma string de nome de usuário, seja números ou letras, seria mapeada para um UID e os nomes sempre procurados para determinar o UID, ao contrário do preguiçoso 'esse nome é feito de números? então vou tratá-lo como um ID '
Matt Warren

83

aqui está um teste no 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

e um 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 é provavelmente a pior ideia que tive:

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

É claro que você pode adicionar um usuário assim, embora não tenha certeza de que seja uma boa idéia a longo prazo.


11
useradd '*'seria divertido - cd /home/*/não funcionaria como esperado e quem sabe como outros utilitários reagiriam ao usar o valor $HOMEdesse usuário.
Liam Dawson

9
uau ubuntu permite isso? Eu me pergunto o que acontece se você tentar useradd 1000(supondo que você já tem um usuário com UID 1000)
thomas_d_j

8
+1 para apenas todos os símbolos proibidos!
EKons

3
Oh, eu posso pensar em pior ...
OrangeDog

4
@IsmaelMiguel: Um literal \0em / etc / passwd provavelmente quebraria muitos programas que o analisam. Mas você provavelmente não conseguiu adicionar um usuário com esse nome em primeiro lugar, usando ferramentas padrão. Chamadas de sistema como mkdir(2)também usam seqüências de comprimento implícito terminadas em 0, para que você não possa criar /home/\0/, porque esse caminho é justo /home.
Peter Cordes

9

Um nome de usuário * Nix geralmente é uma cadeia de 32 caracteres criada pelo utilitário useradd. Este é, como você disse, um resultado direto dos primeiros padrões Unix (tecnicamente BSD). De acordo com a página de manual do FreeBSD passwd(5):

O nome de login não deve começar com um hífen (`- ') e não pode conter caracteres, tabulações ou espaços de 8 bits ou qualquer um destes símbolos:`,: + & #% ^ ()! @ ~ *? <> = | / "'. O símbolo do dólar (` $') é permitido apenas como o último caractere a ser usado com o Samba. Nenhum campo pode conter dois pontos (`: '), pois isso foi usado historicamente para separar os campos no usuário base de dados.

Certos sistemas * Nix costumavam gerar erros obscuros quando apresentados com caracteres especiais em nomes de usuários; portanto, eventualmente, os caracteres especiais foram banidos. Na maioria dos sistemas * Nix modernos, seria relativamente fácil alterar os passwd/ useraddutilitários para dar suporte a nomes de usuário de caracteres especiais, mas a maioria das pessoas hesita em alterar uma coisa tão sem importância, pois isso teria pouco efeito e causaria incompatibilidade reversa.

EDIT:
Como Adonis disse, é de fato possível fazer isso em uma distribuição moderna do Linux, no entanto, é desaconselhável (especialmente quando se encontra programas padronizados ou legados).


5
Claro, mas a pergunta nem menciona caracteres especiais. Ele pergunta por que os nomes de usuário não podem começar com dígitos (que não são caracteres especiais).
31516 Don_crissti

Claro @don_crissti, você prefere que eu pergunte novamente por que historicamente um nome de usuário não pode começar com um espaço, depois pergunte separadamente por que ele não começa historicamente com cada um dos símbolos e, em seguida, pergunte & c termine historicamente com $? Essa "resposta" não se encaixa como um comentário, o que claramente é, mas contém informações úteis relacionadas à pergunta.
frumbert

O que se entende por caracteres de 8 bits nesse parágrafo? IE: Certamente quaisquer caracteres ASCII são de 8 bits?
Matt Warren

feh! /etc/passwdé um arquivo de texto. useradd? pish-tosh. Administradores de sistemas reais usam vi!
infixado em 3/06/16

11
@MattWarren. ASCII é um 7-bit codificação
fpmurphy

1

Existe uma razão técnica para isso? Esse é um artefato dos primórdios do Linux ou Unix e, se houver, existe uma razão pela qual persiste?

Não consigo pensar em uma razão técnica - historicamente, é apenas ASCII. Como é lido e digitado está nas mãos do 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 passei algum tempo navegando nas páginas de manual do arquivo (por exemplo: 1BSD foi a primeira Berkeley Software Distribution de Bill Joy ), não vi nada que especifique nomes de usuário. Isso não quer dizer que não exista, mas eu não o vi.

Então, ficamos com o contexto humano histórico. Quando eu comecei a tecnologia em 1980, sempre usamos nosso nome real para logins. Geralmente o primeiro nome e o sobrenome completos, a menos que haja algum limite de comprimento. Isso foi importante, pois seu nome de login foi usado como endereço de email. Ninguém na época enviou e-mails anônimos. Claro que deve ter havido algumas exceções, não as recordo. No geral, porém, acredito que seja esse o caso.

E de acordo com o rfc5321 # page-63, não há nenhuma restrição para que um "nome" de e-mail comece com um numérico. O gmail criará todos os nomes de usuário numéricos. (pegue agora, eles estão indo rápido).

Portanto, se houver algum código que rejeite um nome de usuário que comece com [0-9], ele provavelmente surgiu mais tarde com algum programador pensando "por que você teria um número como nome?". Mais uma vez, devo dizer que pode muito bem haver código unix histórico que rejeitou um nome de usuário começando com um número. Eu apenas não vi isso. As tabelas de senhas iniciais foram editadas à mão; certamente me lembro disso com frequência, mesmo no começo dos anos 90.

Quanto a por que isso persiste, citarei stroustrup, C ++ 11FAQ. Quando as novas bibliotecas padrão estarão disponíveis?

Para tornar o problema mais difícil, lembre-se de que não é possível eliminar os recursos mais antigos, mesmo que o comitê concorde que eles são ruins: a experiência mostra que os usuários forçam todos os implementadores a continuarem fornecendo recursos reprovados e banidos em opções de compatibilidade (ou por padrão) por décadas.


0

Conforme indicado nas respostas, os nomes de usuário do Linux podem ser todos numéricos. No entanto, essa é uma má ideia, pois confundiria muitas ferramentas de software (e administradores de sistemas humanos!).

Por esse motivo, por exemplo, nomes de usuário e nomes de grupos numéricos são preteridos no RHEL 7 e proibidos no RHEL 8:

8.7.1 shadow-utilsnão permite mais nomes de usuários e grupos numéricos

Os comandos useradde groupaddnão permitem nomes de usuários e grupos que consistem apenas em caracteres numéricos. O motivo para não permitir esses nomes é que isso pode confundir potencialmente muitas ferramentas que funcionam com nomes de usuários e grupos e IDs de usuários e grupos (que são números). Observe que os nomes de usuário e grupo todos numéricos foram descontinuados no Red Hat Enterprise Linux 7 e seu suporte foi completamente removido no Red Hat Enterprise Linux 8.


-2

Não tenho certeza se consideraria uma razão técnica, mas a regra se resume a "o nome de usuário deve ser um identificador de linguagem de programação válido". Os identificadores têm algumas boas propriedades devido à sua sintaxe restrita: eles não podem ser confundidos com números, mesmo ao ler caracteres por caractere, e não precisam ser citados ao passar por um analisador. Em resumo, eles são facilmente reconhecidos como nomes, o que reduz o trabalho de programação necessário para trabalhar com eles.

Duvido que tenha sido realmente necessário proibir nomes de usuários que começam com um dígito, mas "um nome de usuário deve ser um identificador" é uma regra simples que seria clara para 100% dos usuários iniciais do Unix.

Se o único lugar em que você digitar seu nome de usuário estiver no prompt de login em uma GUI, provavelmente não fará diferença quais caracteres ele inclui (isentar nulos e coisas como novas linhas, o que daria até mesmo o soluço no procedimento de login). Mas se você trabalha muito na linha de comando, é conveniente ter um nome de usuário fácil de trabalhar.


Humm, um login (nome de usuário) não tem absolutamente nada a ver com um identificador de linguagem de programação.
fpmurphy

E, no entanto, a definição de um nome de usuário válido é a mesma que para identificadores, esse é o ponto.
Alexis
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.