添加新用户时,如何验证字符串?
我想有一个正则表达式。那个正则表达式是什么?
答案1
很抱歉对这个近 4 年前的问题进行了彻底的讨论,但它在互联网搜索结果中的出现率相当高,值得更多关注。
更准确的正则表达式是(是的,我知道,尽管有手册页):
^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\$)$
希望这对那些正在寻找的人有所帮助。
分解它:
它应该开始(
^
) 仅包含小写字母或下划线 ([a-z_]
)。这正好占据1特点。那么应该是一的任何一个(
( ... )
):- 从0到31字符 (
{0,31}
)字母,数字,下划线,和/或连字符([a-z0-9_-]
),
或者(
|
)- 从0到30上述的字符加
\$
末尾 有美元符号 ( ),
进而
- 从0到31字符 (
没有更多字符了过去的这种模式(
$
)。
对于那些不熟悉正则表达式的人,您可能会问为什么美元符号在 2.2 中有反斜杠,但在 3 中没有。这是因为在大多数(所有?)正则表达式变体中,美元符号表示字符串(或行)的结尾, ETC。)。根据所使用的引擎,如果它是实际字符串的一部分,则需要对其进行转义(我无法想象不使用反斜杠作为转义的正则表达式引擎)。
请注意,Debian 和 Ubuntu 删除了对完全 POSIX/shadow 上游兼容用户名的一些限制(例如,我不知道这是否已修复,但它们允许用户名以数字开头 - 这实际上是导致这个错误)。如果你想保证跨平台,我建议使用上面的正则表达式,而不是 Debian、Ubuntu 等中通过/失败检查的正则表达式。
答案2
通常建议仅使用以小写字母或下划线开头,后跟小写字母、数字、下划线或破折号的用户名。它们可以以美元符号结尾。用正则表达式来说:[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);
}