验证 Linux 用户的正则表达式是什么?

验证 Linux 用户的正则表达式是什么?

添加新用户时,如何验证字符串?

我想有一个正则表达式。那个正则表达式是什么?

答案1

很抱歉对这个近 4 年前的问题进行了彻底的讨论,但它在互联网搜索结果中的出现率相当高,值得更多关注。

更准确的正则表达式是(是的,我知道,尽管有手册页):

^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\$)$

希望这对那些正在寻找的人有所帮助。

分解它:

  1. 它应该开始( ^) 仅包含小写字母或下划线 ( [a-z_])。这正好占据1特点。

  2. 那么应该是任何一个( ( ... )):

    1. 031字符 ( {0,31})字母,数字,下划线,和/或连字符( [a-z0-9_-]),

    或者( |)

    1. 030上述的字符\$末尾 有美元符号 ( ),

    进而

  3. 没有更多字符了过去的这种模式($)。

对于那些不熟悉正则表达式的人,您可能会问为什么美元符号在 2.2 中有反斜杠,但在 3 中没有。这是因为在大多数(所有?)正则表达式变体中,美元符号表示字符串(或行)的结尾, ETC。)。根据所使用的引擎,如果它是实际字符串的一部分,则需要对其进行转义(我无法想象不使用反斜杠作为转义的正则表达式引擎)。

请注意,Debian 和 Ubuntu 删除了对完全 POSIX/shadow 上游兼容用户名的一些限制(例如,我不知道这是否已修复,但它们允许用户名以数字开头 - 这实际上是导致这个错误)。如果你想保证跨平台,我建议使用上面的正则表达式,而不是 Debian、Ubuntu 等中通过/失败检查的正则表达式。

答案2

来自useradd 的手册页 (8):

通常建议仅使用以小写字母或下划线开头,后跟小写字母、数字、下划线或破折号的用户名。它们可以以美元符号结尾。用正则表达式来说:[a-z_][a-z0-9_-]*[$]?

在 Debian 上,唯一的限制是用户名不能以破折号('-')开头,也不能包含冒号(':')或空格(空格:' ',行尾:'\n',制表:' \t' 等)。请注意,使用斜杠(“/”)可能会破坏用户主目录定义的默认算法。

用户名的长度最多只能为 32 个字符。

所以,有一个一般性的建议。实际的限制取决于您的实施/发行版的具体情况。在基于 Debian 的系统上,显然没有非常严格的限制。事实上,我刚刚useradd '€'在我的 Ubuntu 盒子上尝试过,它成功了。当然,这可能会破坏一些不期望此类不寻常用户名的应用程序。为了避免此类问题,最好遵循一般建议。

答案3

用户名的一般规则是其长度必须小于 32 个字符。有效的用户名取决于您的发行版。

在 Debian 中,中shadow-utils 4.1有一个is_valid_name函数chkname.c

static bool is_valid_name (const char *name)
{
    /*
     * User/group names must match [a-z_][a-z0-9_-]*[$]
     */
    if (('\0' == *name) ||
        !((('a' <= *name) && ('z' >= *name)) || ('_' == *name))) {
        return false;
    }

    while ('\0' != *++name) {
        if (!(( ('a' <= *name) && ('z' >= *name) ) ||
              ( ('0' <= *name) && ('9' >= *name) ) ||
              ('_' == *name) ||
              ('-' == *name) ||
              ( ('$' == *name) && ('\0' == *(name + 1)) )
             )) {
            return false;
        }
    }

    return true;
}

之前检查过用户名的长度:

bool is_valid_user_name (const char *name)
{
    /*
     * User names are limited by whatever utmp can
     * handle.
     */
    if (strlen (name) > USER_NAME_MAX_LENGTH) {
        return false;
    }

    return is_valid_name (name);
}

相关内容