当前位置:  开发笔记 > 运维 > 正文

CentOS 6和RHEL 6上的linux用户名有哪些真正的规则?

如何解决《CentOS6和RHEL6上的linux用户名有哪些真正的规则?》经验,为你挑选了1个好方法。

我正在编写一些可用于创建Linux用户帐户的Web UI页面.此Web UI将用于CentOS 6(源自RHEL 6).我发现有关什么构成有效Linux用户名的信息不一致且不完整.我去了源代码,检查了一个Linux shadow-utils源代码包,但我没有确保我所看到的版本实际上与CentOS 6的版本相同.

下面是我目前使用的代码片段,其中包括来自shadow-utils软件包版本4.1.4.3的注释的复制/粘贴,以及我自己的一些注释,以及Java正则表达式搜索,以便通过查看阴影来了解我的理解utils源码.

chkname.c中引用的"is_valid_name()"检查显然不是Linux上的useradd命令所使用的,因为注释(和C代码源)不允许以数字开头的名称.但是,useradd允许创建像"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 A-Z 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);
}

Pablo Castel.. 36

基本的gnu/linux用户名是32个字符的字符串(useradd(8)).这是BSD 4.3标准的传统格式.passwd(5)添加一些额外的限制,例如,不要使用大写字母,不要使用圆点,不要在破折号中结束它,它不能包括冒号.

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

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

这是问题的一半.现代GNU/Linux发行版使用PAM进行用户身份验证.有了它,您可以选择任何您想要的规则以及任何数据源.

既然你正在编写一个程序这是更好地定义自己的格式,然后使用类似的pam_ldap,pam_mysql等来访问它.



1> Pablo Castel..:

基本的gnu/linux用户名是32个字符的字符串(useradd(8)).这是BSD 4.3标准的传统格式.passwd(5)添加一些额外的限制,例如,不要使用大写字母,不要使用圆点,不要在破折号中结束它,它不能包括冒号.

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

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

这是问题的一半.现代GNU/Linux发行版使用PAM进行用户身份验证.有了它,您可以选择任何您想要的规则以及任何数据源.

既然你正在编写一个程序这是更好地定义自己的格式,然后使用类似的pam_ldap,pam_mysql等来访问它.


a gotcha:`([a-z _] [a-z0-9 _] {0,30})`读作"小写或下划线,后跟0到30个字母数字字符",意思是用户名的总长度可以是**31个字符**.
@berkes加上C字符串的终止零点是32,不是吗?
推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有