使用者名称中有点的缺点是什么?

一个学生刚刚问到,用户名中有一个点(.)会有什么不利影响。例如:john.doe 这会对系统或任何应用程序产生什么影响?
4个回答

POSIX关于用户名的规定如下:
引用: [...] 为了在符合IEEE Std 1003.1-2001标准的系统之间具有可移植性,用户名的值由可移植文件名字符集中的字符组成。连字符不应作为可移植用户名的第一个字符。
... 其中可移植的文件名字符集为:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
a b c d e f g h i j k l m n o p q r s t u v w x y z
0 1 2 3 4 5 6 7 8 9 . _ -

此外, /etc/adduser.conf 文件的手册页面 Manpage icon 也指出:
   VALID NAMES
          adduser and addgroup enforce conformity to IEEE Std 1003.1-2001,
          which  allows  only  the following characters to appear in group
          and user names: letters, digits, underscores, periods, at  signs
          (@) and dashes. The name may not start with a dash. The "$" sign
          is allowed at the end of usernames (to conform to samba).

          An additional  check  can  be  adjusted  via  the  configuration
          parameter NAME_REGEX to enforce a local policy.

然而, 尽管这两个规范似乎都包含了点号,但Ubuntu(至少在我的13.04版本上)似乎不允许使用它。
⊳ sudo adduser as.df
adduser: Please enter a username matching the regular expression configured
via the NAME_REGEX[_SYSTEM] configuration variable.  Use the `--force-badname'
option to relax this check or reconfigure NAME_REGEX.

Ubuntu中的默认NAME_REGEX是(来自/etc/adduser.conf手册页):
^[a-z][-a-z0-9]*$

以小写字母开头,然后可以是任意数量的破折号、小写字母或数字。不允许使用下划线(_)、@或.。
所以,
总结一下,在Ubuntu用户名中可以使用点(.),只需要在/etc/adduser.conf中更改NAME_REGEX即可。由于它符合POSIX标准,所以在任何符合POSIX标准的程序中,用户名中有点(.)应该没有任何问题。
要启用用户名中的点(.)
  1. 在终端中运行以下命令:
  2. sudo nano /etc/adduser.conf
    
  3. 找到以下行(文件末尾附近)
  4. #NAME_REGEX="^[a-z][-a-z0-9]*$"
    

    将其替换为

    NAME_REGEX='^[a-z][-.a-z0-9]*$'
    

    请注意,- 必须保持方括号表达式 [...] 中的第一个字符,否则它将被视为指定范围 a-z

  5. 按下 Ctrl+X,然后按下 Y,最后按下 Enter

参考资料:

@vasa1 谢谢你指出这个问题,已经修复了。 - kiri
3嗨minerz029,在接受这个答案之前,我可以看到它是一个非常出色的答案,毫无疑问。你能否提供一下Ubuntu做出这个决定的原因呢? - Luis Alvarado
2@LuisAlvarado:这可能是为了与[非POSIX]程序兼容,这些程序期望使用更有限的字符集作为用户名。Ubuntu默认允许的字符几乎可以保证在几乎所有程序中正常工作。adduser的手册页将默认的正则表达式描述为“最保守的”,处于用户名安全的一侧。 - kiri
那么,我该如何更改正则表达式呢?使用 NAME_REGEX="^[a-z][-a-z0-9_\.]*\$" 无法完成任务,尽管我希望它能够工作。它会产生你在 然而 段落中提到的相同错误。 - 0xC0000022L
@0xC0000022L 请检查我的更新答案。我已确认它在我的 14.04 系统上可行。 - kiri
@minerz029:你试过创建像 foo.bar 这样的东西吗?我不明白为什么 . 不能像通常在 Perl 中可以转义一样进行转义(adduser 是一个 Perl 脚本)。 - 0xC0000022L
1这对我没有起作用,但在/etc/adduser.conf中添加NAME_REGEX="^[a-z][-a-z0-9_.]*\$?$"起了作用。 - Mario
2不要改变正则表达式。只需调用useradd函数: sudo useradd -m my.user。这就是我们在Userify中所做的,而且它也适用于多个平台。 - fatal_error
useradd 默认不会设置用户的 shell,最好使用 sudo adduser --force-badname my.user - gmk57

马克·哈伯(Marc Haber)解释了Debian错误#604242(默认情况下允许用户名中有点号)可能存在的缺陷:

在用户名中使用点号会导致一些问题,因为仍然接受点号作为用户名称和组名称之间的分隔符,因此使用chown的脚本会出现问题。如果chown仍然接受点号,则将使用此记号的脚本会断开,如果用户名包含点,则会出现问题。

我建议保留当前默认设置(可以通过本地配置覆盖),直到chown停止接受点号作为分隔符为止。

chown仍然接受点作为分隔符,尽管它不再被记录在文档中。我同意POSIX兼容性应该优先考虑,在几个系统上确实使用了包含点的用户名而没有任何负面影响。


读取用户名的应用程序可能使用一个正则表达式,假设您的用户名遵循规则,因此无法处理您的用户名。

但同样,他们可能会做出与发行版建立的假设相冲突的假设,对吗? - 0xC0000022L

似乎在这个限制背后存在一些原因。
如果您尝试运行用于脚本的systemd服务,它可能会以root身份启动而不是作为用户。这是由于systemd无法将带有点(例如domain.com用户名)的用户识别为有效用户,并以root身份运行服务造成的。尽管systemd已经修复了这个问题,但仍存在风险。
此外,用户名中包含点会导致使用chown命令的脚本出现一些问题,因为chown仍然接受点作为用户名称和组名之间的分隔符。如果chown仍然接受点作为分隔符,那么使用这种表示法的脚本将会出现问题,如果用户名包含点的话,就会出错。