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)
希望这有助于一些搜索。
分解:
它应该以( )开头^,仅以小写字母或下划线 ( [a-z_])开头。这正好占用1 个字符。
然后,它应该是一个的任一(( ... )):
{0,31}的)字母,数字,下划线,和/或连字符([a-z0-9_-]),或( |)
\$)结尾,进而
没有更多字符超过此模式 ( $)。
对于那些不熟悉正则表达式的人,您可能会问为什么美元符号在 2.2 中有反斜杠,而在 3 中没有。这是因为在大多数(所有?)正则表达式变体中,美元符号表示字符串(或行)的结尾, 等等。)。根据所使用的引擎,如果它是实际字符串的一部分,则需要对其进行转义(我想不出不使用反斜杠作为转义符的正则表达式引擎的头顶)。
请注意,Debian 和 Ubuntu 删除了对完全符合 POSIX/shadow 上游标准的用户名的一些限制(例如,我不知道这是否已修复,但它们允许用户名以数字开头 - 这实际上是导致此问题的原因)错误)。如果你想保证跨平台,我会推荐上面的正则表达式,而不是在 Debian、Ubuntu 和其他人中通过/失败检查的内容。
Mal*_*ppa 17
通常建议仅使用以小写字母或下划线开头,后跟小写字母、数字、下划线或破折号的用户名。它们可以以美元符号结尾。在正则表达式中:[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)