为什么Linux用户名不能以数字开头?


84

有技术原因吗?这是Linux或Unix早期的人为产物吗?如果是这样,那么它持续存在的原因是什么?


22
既然这在答案中被揭穿了,那么您从这句话中得到什么呢?
l0b0

19
@ l0b0-每useradd(来自shadow-utils 4.2.1)手册页(请参见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-哦,仅仅因为一个发行版(以这种事情而闻名)允许它并不意味着“它在答案中被揭穿了”。这个问题被加了标签linux,没有ubuntu。尝试在archlinux上进行操作
don_crissti

1
@don_crissti 显然,它不适用于所有 Linux发行版,因此很有趣的是知道该限制来自何处。
l0b0

5
甚至Ubuntu也很在乎:当您使用Live CD / Ubiquity安装时,您的用户名“必须以小写字母开头”
43Tesseracts

Answers:


136

一些命令(例如chown)可以接受用户名或数字用户ID,因此允许使用全数字的用户名会破坏这一点。

允许名称以数字开头并包含一些字母的规则可能被认为是不值得的。相反,只需要以字母字符开头。

编辑:

从其他响应中可以看出,某些发行版已经颠覆了这一限制。在这种情况下,根据GNU Core Utils文档

POSIX要求这些命令首先尝试将指定的字符串解析为名称,只有一次失败后,再尝试将其解释为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.

添加名为“ 0”的用户只会带来麻烦(UID 0 == root用户)。但是,请注意,组/用户ID参数前面可以带有“ +”号,以强制将其解释为整数。


13
这是唯一实际回答问题的帖子。您应该添加一个示例,向人们展示在Linux发行版上不习惯于破坏上游代码的情况,运行的结果useradd 253useradd: invalid user name '253'
don_crissti 2016年

2
如果要添加到帖子中,请在此处记录源代码
don_crissti

5
您能想象如果用户名1000具有UID 253时会造成混乱的机会吗?还是一般来说,对于与UID不匹配的数字用户名?当然,与小组相似。
乔纳森·莱夫勒

5
我有一个LDAP系统,其中一些用户使用其(数字)员工代码/注册号作为用户名。我很快学会了规范化用户ID(chown -R $(id -u $username) ...)。
大师

2
理想情况下,将用户名字符串(无论是数字还是字母)映射到UID,并且总是查找名称来确定UID,而不是懒惰的“此名称由数字组成?然后我把它当作一个ID”
马特·沃伦

83

这是使用数字在ubuntu 14.04上进行的测试:

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

另一个使用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
😀

这可能是我最糟糕的想法:

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

显然,您可以添加这样的用户,尽管从长远来看,我不确定这是个好主意。


1
useradd '*'会很有趣- cd /home/*/不会按预期工作,谁知道使用该$HOME用户的值时其他实用程序会如何反应。
利亚姆·道森

9
ubuntu允许吗?我想知道如果您尝试useradd 1000(假设您已经有一个UID 1000的用户)会发生什么?
thomas_d_j

8
+1仅用于所有禁止的符号!
EKons,2016年

3
噢,我能想到的更糟……
OrangeDog

4
@IsmaelMiguel:\0/ etc / passwd中的文字可能会破坏许多解析它的程序。但是您可能无法使用标准工具首先添加具有该名称的用户。像这样的系统调用mkdir(2)也使用0终止的隐式长度字符串,因此您无法创建/home/\0/,因为该路径为just /home
彼得·科德斯

9

* Nix用户名通常是由实用程序创建的32个字符长的字符串useradd。正如您所说,这是早期Unix(技术上是BSD)标准的直接结果。根据FreeBSD手册页passwd(5)

登录名不能以连字符(`-)开头,并且不能包含8位字符,制表符或空格或以下任何符号:`,:+&#%^()!@〜*?<> = | /“'。仅允许将美元符号(`$)作为与Samba一起使用的最后一个字符。任何字段都不能包含冒号(`:'),因为它在历史上一直用于分隔用户中的字段数据库。

某些* Nix系统过去在用户名中出现特殊字符时会引发模糊错误,因此最终禁止了特殊字符。在大多数现代的* Nix系统中,更改passwd/ useradd实用程序以支持特殊字符的用户名相对容易,但是大多数人都不愿意更改这种不重要的内容,因为它的作用很小并且会导致向后不兼容。

编辑:
正如Adonis所说,实际上可以在现代Linux发行版中做到这一点,但是建议不多(尤其是在遇到标准化或遗留程序时)。


5
可以,但是这个问题甚至都没有提到特殊字符。它询问为什么用户名不能以数字(不是特殊字符)开头。
don_crissti

当然,@ don_crissti,您是否希望我再问一遍,为什么历史上用户名不能以空格开头,然后分别询问为什么从历史上讲,用户名不能以每个符号开头,然后以历史记录&c以$结尾?该“答案”显然不适合作为评论,但包含与问题相关的有用信息。
frumbert

该段中的8位字符是什么意思?IE:当然,任何ASCII字符都是8位的吗?
马特·沃伦

h! /etc/passwd是一个文本文件。 useradd?pish-tosh。真正的系统管理员使用vi
2013年

1
@MattWarren。ASCII是一个7位编码
fpmurphy

1

有技术原因吗?这是Linux或Unix早期的人为产物吗?如果是这样,那么它持续存在的原因是什么?

我想不出技术原因-从历史上看,它只是ASCII。如何读入然后键入它在编码器手中。

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

由于我花了一些时间浏览存档手册页(例如: 1BSD是Bill Joy的第一个Berkeley软件发行版),所以我什么也看不到指定用户名。这并不是说它不存在,但我还没有看到它。

因此,我们只剩下人类历史背景。早在1980年我开始从事技术工作时,我们始终使用真实姓名登录。除非有长度限制,否则通常为名字的全名。这很重要,因为您的登录名被用作您的电子邮件地址。后来没人再发送匿名电子邮件。当然必须有一些例外,我不记得他们了。总体而言,我认为情况确实如此。

而且根据rfc5321#page-63,对电子邮件“名称”以数字开头没有任何限制。gmail将创建所有数字用户名。(立即获取,他们进展很快)。

因此,如果有任何代码拒绝以[0-9]开头的用户名,则该代码可能在以后出现,并且某些程序员认为“为什么要使用数字作为名称?”。再一次,我不得不说,很有可能是历史悠久的Unix代码拒绝了以数字开头的用户名。我只是没看过。早期的密码表是手工编辑的,我当然记得经常这样做,即使在90年代初也是如此。

至于为什么它仍然存在,我将引用stroustrup,C ++ 11FAQ,新标准库何时可用?

为了使问题更加棘手,请记住,即使委员会同意它们是不好的,也要消除较旧的功能是不可行的:经验表明,用户强迫每个实施者在兼容性开关下(或默认情况下)继续提供不推荐使用和禁止使用的功能。数十年。


0

正如答案中指出的那样,Linux用户名可以是全数字。但是,这是一个坏主意,因为它会使许多软件工具(和人类系统管理员!)混淆。

因此,例如,在RHEL 7中不推荐使用全数字的用户名和组名,而在RHEL 8中则禁止使用:

8.7.1。shadow-utils不再允许使用全数字的用户名和组名

useraddgroupadd命令禁止由数字字符纯粹用户和组名称。不允许使用此类名称的原因是,这可能会使许多使用用户和组名称以及用户和组ID(即数字)的工具产生混淆。请注意,全数字用户名和组名在Red Hat Enterprise Linux 7中已弃用,并且它们的支持在Red Hat Enterprise Linux 8中已完全删除。


-2

我不确定是否将其称为技术原因,但该规则归结为“用户名必须是有效的编程语言标识符”。标识符由于其受限制的语法而具有一些不错的属性:即使在按字符读取字符时也不能将数字误认为数字,并且在通过解析器时无需将其引号。简而言之,它们很容易被识别为名称,从而减少了使用它们所需的编程工作。

我怀疑是否真的有必要禁止以数字开头的用户名,但是“用户名必须是标识符”是一个简单的规则,对于100%的早期Unix用户而言,这是显而易见的。

如果您键入用户名的唯一位置是在GUI的登录提示中,则其中包含的字符可能没有区别(免除null和换行符之类的东西,这甚至会给登录过程带来麻烦)。但是,如果您从命令行进行大量工作,那么拥有易于使用的用户名的便利性。


Humm,登录名(用户名)与编程语言标识符完全无关。
fpmurphy

然而有效的用户名的定义一样的标识,这就是问题所在。
亚历克西斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.