在CentOS 6和RHEL 6上,Linux用户名的真正规则是什么?

我正在编写一些可用于创buildLinux用户帐户的Web UI页面。 这个Web UI将在CentOS 6上使用(从RHEL 6派生)。 我发现有关什么是有效的Linux用户名的不一致和不完整的信息。 我去了源代码,检查了一个Linux的shadow-utils源码包,但是我没有确定我看到的版本实际上和CentOS 6的一部分是一样的。

下面是我目前使用的代码片段,其中包括shadow-utils软件包版本4.1.4.3的复制/粘贴,以及一些我自己的注释,以及Java正则expression式search, utils源码。

chkname.c中引用的“is_valid_name()”检查显然不是Linux上的useradd命令使用的,因为注释(和C代码源)不允许以数字开头的名称。 但是,useradd确实允许创build一个像“1234”这样的帐户。

我会很高兴帮助调整从我现在到什么是更正确的,以及有关如何使用一些略有不同的is_valid_name函数实现useradd.c的信息。

谢谢! 艾伦

/** * Define constants for use in isNameLinuxCompatible(...) method. * * The source for the Linux compatible user name rule is is_valid_name(...) a function in the "shadow" package * for Linux. The source file for that function has a comment as follows: * User/group names must match [a-z_][a-z0-9_-]*[$] * That expression is a little loose/sloppy since * (1) the trailing $ sign is optional, and * (2) uppercase AZ is also ok (and case is significant, 'A' != 'a'). * * We deal with (1) by using the [$]? form where the ? means zero or more characters (aka "greedy"). * We deal with (2) by using the CASE_INSENSITIVE option. * * Another way to express this is: * 1st character: a-z_ required at least one char * chars other than first and last: a-z0-9_- optional * last character: $ optional * Max length is 31. Min length is 1. * * NOTE: The initial ^ and final $ below are important since we need the entire string to satisfy the rule, * from beginning to end. * * See http://download.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html for reference info on pattern matching. */ private static final String LINUX_USERNAME_REGEX = "^[a-z_][a-z0-9_-]*[$]?$"; private static final Pattern LINUX_USERNAME_PATTERN = Pattern.compile(LINUX_USERNAME_REGEX, Pattern.CASE_INSENSITIVE); private static final int LINUX_USERNAME_MINLENGTH = 1; private static final int LINUX_USERNAME_MAXLENGTH = 31; /** * See if username is compatible with standard Linux rules for usernames, in terms of length and * in terms of content. * * @param username the name to be checked for validity * @return true if Linux compatible, else false */ public boolean isNameLinuxCompatible (final String username) { boolean nameOK = false; if (username != null) { int len = username.length(); if ((len >= LINUX_USERNAME_MINLENGTH) && (len <= LINUX_USERNAME_MAXLENGTH)) { Matcher m = LINUX_USERNAME_PATTERN.matcher(username); nameOK = m.find(); } } return (nameOK); } 

基本的GNU / Linux用户名是32个字符的字符串( useradd(8) )。 这是BSD 4.3标准的传统格式。 passwd(5)增加了一些额外的限制,不要使用大写字母,不要使用点,不要用短划线结尾,它不能包含冒号。

为了安全起见,遵循C标识符的相同规则:

 ([a-z_][a-z0-9_]{0,30}) 

这是问题的一半。 现代的GNU / Linux发行版使用PAM进行用户认证。 有了它,你可以选择任何你想要的规则,也可以选择任何数据源。

由于您正在编写程序,因此最好定义自己的格式,然后使用像pam_ldappam_mysql等来访问它。