在 Linux 上我应该使用或不应该在用户名中使用哪些字符?

在 Linux 上我应该使用或不应该在用户名中使用哪些字符?

我想创建以域名命名的用户帐户。adduser 抱怨用户名需要匹配NAME_REGEX正则表达式。

adduser: Please enter a username matching the regular expression configured
via the NAME_REGEX configuration variable.  Use the `--force-badname'
option to relax this check or reconfigure NAME_REGEX.

我可以使用 useradd 添加用户,没有任何问题。有什么理由我不应该修改正则表达式以允许.,-_

哪些字符会导致问题并且不应该出现在用户名中?

这是默认的NAME_REGEX

NAME_REGEX="^[a-z][-a-z0-9]*\$"

答案1

我的建议是遵循默认 NAME_REGEX 推荐的标准。实际上,在 *NIX 下,您可以将几乎任何内容放入用户名中,但您可能会遇到库代码做出假设的奇怪问题。例如:

https://web.archive.org/web/20170928165345/http://blog.endpoint.com/2008/08/on-valid-unix-usernames-and-ones-sanity.html

我的问题是:如果删除不常见的标点符号,您是否会有很多域名相互冲突?例如,您的域名是否同时包含“QUALITY-ASSURANCE”和“QUALITYASSURANCE”?如果没有,您可以简单地采用删除不常见字符的策略,并使用剩余的字符作为用户名。

此外,您还可以使用GECOS 字段在 /etc/passwd 信息中存储原始的、未修改的域名,并且脚本可以很容易地提取它。

答案2

更具体地说,POSIX(“Unix 可移植操作系统接口”)标准(IEEE 标准 1003.1 2008)规定


3.437 用户名

用于标识用户的字符串;另请参阅用户数据库。为了便于在符合 POSIX.1-2017 的系统之间移植,该值由可移植文件名字符集中的字符组成。该<hyphen-minus>字符不应用作可移植用户名的第一个字符。


3.282 可移植文件名字符集

The set of characters from which portable filenames are constructed.

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 . _ -

任何符合此标准的用户名都符合 POSIX 标准,并且应该是安全的。

答案3

这种限制似乎是有原因的。

如果您尝试运行systemd(1)脚本服务,则脚本可能会以root普通用户身份启动,而不是以普通用户身份启动。这是因为脚本systemd无法将带点(domain.com例如用户名)的用户识别为有效用户,而是以普通用户身份运行服务root。尽管如此,这个问题可能已经修复systemd,但仍存在风险。

此外,用户名中包含点还会在使用 的脚本中产生一些问题 chown(1),该脚本接受点作为用户名和组名之间的分隔符,请参阅chown(1)系统的手册页,以确定它是旧版本还是现代版本。在较旧的系统中,可能会有使用此表示法的脚本,如果用户名包含点,则脚本会中断。

答案4

从 NAME_REGEX 可以推断出,除了大写和小写字母 a 到 z 以及数字 0 到 9 之外的所有内容都是错误的。

相关内容