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

Ion*_*zău 28 linux users regular-expression

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

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

小智 23

很抱歉对这个将近 4 年前的问题提出质疑,但它在互联网搜索结果中的排名非常高,值得更多关注。

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

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

希望这有助于一些搜索。

分解:

  1. 它应该以( )开头^,仅以小写字母或下划线 ( [a-z_])开头。这正好占用1 个字符。

  2. 然后,它应该是一个任一( ... )):

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

    ( |)

    1. 030以上的字符 一美元符号符号(\$)结尾,

    进而

  3. 没有更多字符超过此模式 ( $)。

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

请注意,Debian 和 Ubuntu 删除了对完全符合 POSIX/shadow 上游标准的用户名的一些限制(例如,我不知道这是否已修复,但它们允许用户名以数字开头 - 这实际上是导致此问题的原因)错误)。如果你想保证跨平台,我会推荐上面的正则表达式,而不是在 Debian、Ubuntu 和其他人中通过/失败检查的内容。


Mal*_*ppa 17

useradd (8)手册页

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

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

用户名最多只能包含 32 个字符。

所以,有一个一般性建议。实际约束取决于您的实现/分发的细节。在基于 Debian 的系统上,显然没有非常严格的限制。事实上,我只是useradd '€'在我的 Ubuntu 机器上试过,它奏效了。当然,这可能会破坏一些不希望出现这种不寻常用户名的应用程序。为避免此类问题,最好遵循一般建议。


cuo*_*glm 16

用户名的一般规则是其长度必须小于 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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);
}
Run Code Online (Sandbox Code Playgroud)