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

Ed *_*ber 49 linux user-accounts

我想创建以域名命名的用户帐户。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.
Run Code Online (Sandbox Code Playgroud)

我可以毫无怨言地使用 useradd 添加用户。是否有理由我不应该修改正则表达式以允许.,-_

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

这是默认值NAME_REGEX

NAME_REGEX="^[a-z][-a-z0-9]*\$"
Run Code Online (Sandbox Code Playgroud)

Hop*_*00b 32

更具体地说,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 . _ -
Run Code Online (Sandbox Code Playgroud)

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

  • 虽然这是真的,但通常不赞成在用户名中使用大写字符 - 人们对区分大小写的密码有足够的麻烦,让他们必须记住用户名中的大小写只是在他们失败时踢他们。(例外:当您的用户名约定是“全部大写字符”时。) (7认同)
  • 从 POSIX.1-2017 开始,这些定义发生了一些变化。3.431 用户名现在是 [3.437 用户名](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_437) 和 3.278 可移植文件名字符集现在是 [3.282 可移植 http 文件名字符集] ://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_282) (2认同)
  • @voretaq7我认为合法的是在用户名中*保留*大小写,但使登录不区分大小写。所以用户名可以是 CatInTheHat 但登录时指定 catinthehat 或 catintheHAT 或其他什么。 (2认同)

ste*_*eha 29

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

http://blog.endpoint.com/2008/08/on-valid-unix-usernames-and-ones-sanity.html

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

此外,您可以使用/etc/passwd 信息中GECOS 字段的“真实姓名”部分来存储原始的、未修改的域名,脚本可以很容易地提取它。