我想创建以域名命名的用户帐户。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 下,您可以将几乎任何内容放入用户名中,但您可能会遇到库代码做出假设的奇怪问题。例如:
我的问题是:如果删除不常见的标点符号,您是否会有很多域名相互冲突?例如,您的域名是否同时包含“QUALITY-ASSURANCE”和“QUALITYASSURANCE”?如果没有,您可以简单地采用删除不常见字符的策略,并使用剩余的字符作为用户名。
此外,您还可以使用GECOS 字段在 /etc/passwd 信息中存储原始的、未修改的域名,并且脚本可以很容易地提取它。
答案2
更具体地说,POSIX(“Unix 可移植操作系统接口”)标准(IEEE 标准 1003.1 2008)规定:
用于标识用户的字符串;另请参阅用户数据库。为了便于在符合 POSIX.1-2017 的系统之间移植,该值由可移植文件名字符集中的字符组成。该
<hyphen-minus>
字符不应用作可移植用户名的第一个字符。
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 之外的所有内容都是错误的。