当前位置: 首页 > 面试题库 >

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

汤洋
2023-03-14
问题内容

我正在编写一些可用于创建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);
}

问题答案:

基本的gnu / linux用户名是32个字符串(useradd(8))。这是BSD
4.3标准的传统格式。passwd(5)添加了一些其他限制,例如,不要使用大写字母,不要使用圆点,不要以破折号结尾,不得包含冒号。

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

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

那是问题的一半。现代的GNU / Linux发行版使用PAM进行用户身份验证。使用它,您可以选择所需的任何规则以及任何数据源。

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



 类似资料:
  • 我想检查用户的用户名和电话号码是否唯一。我已经用FirebaseFirestore实现了它。getInstance()。集合(“用户”)。whereEqualTo(“电话”,ph)。get()。addOnCompleteListener(…) 这是我的firestore规则: 代码运行良好,没有问题。我在使用方法和请求之前检查这个。啊。uid将始终为空。要使代码工作,我必须保持

  • 我定义了一个Xtext语法规则来解析一个简单的时间戳,比如YYYY-MM-DDTHH-MM-SS,但是,当我发送类似于

  • 我正在客户端使用带有标准Facebook登录按钮的Facebook Javascript SDK。当用户单击按钮时,我会从Facebook获得用户id。稍后,我将从服务器端使用Facebook PHP SDK。我想检查用户id是否是真实的用户id。我搜索了一些资源,但我不知道我的方法是否正确。我使用访问令牌。我的链接在上面。当我发送请求时,收到一个错误。客户端id是我的应用程序id,客户端机密是密

  • 我正在使用cloudera VM,我想连接到beeline,但当我离开时,它询问用户名和密码,它没有连接。谁能告诉我用户名和密码。 !连接JDBC:hive2://localhost:10000/连接到JDBC:hive2://localhost:10000/输入JDBC:hive2://localhost:10000/输入JDBC:hive2://localhost:10000/输入密码:错误:

  • 为了让Android用户通过我的应用程序注册和登录,我将。read和。write设置为true。我的问题是任何人都可以访问users JSON文件,因为它是公共的。如何限制只能通过应用程序和Firebase控制台访问数据库?以下是规则:

  • RPM 二进制包的命名需遵守统一的命名规则,用户通过名称就可以直接获取这类包的版本、适用平台等信息。 RPM 二进制包命名的一般格式如下: 包名-版本号-发布次数-发行商-Linux平台-适合的硬件平台-包扩展名 例如,RPM 包的名称是 ,其中: httped:软件包名。这里需要注意,httped 是包名,而 httpd-2.2.15-15.el6.centos.1.i686.rpm 通常称为包