<hr class=“my12大纲无baw0 bb bc-POWER-400”/
想改进此问题吗?更新问题,使其成为堆栈溢出的主题。
已于9个月前关闭
我正在编写一些可用于创建Linux用户帐户的web UI页面。此web UI将在CentOS 6(源自RHEL 6)上使用。我发现关于什么构成有效的Linux用户名的信息不一致且不完整。我去了源代码处,检查了Linux shadow utils源代码包,但我没有确保我所查看的版本实际上与CentOS 6中的版本相同
下面是我目前使用的代码片段,其中包括来自shadow utils包版本4.1.4.3的注释的复制/粘贴,加上我自己的一些注释,以及一个Java正则表达式搜索,以了解shadow utils源代码
引用的“is_valid_name()”签入chkname.c显然不是Linux上useradd命令使用的,因为注释(和c代码源代码)不允许名称以数字开头。但是,useradd允许用户创建类似“1234”的帐户
我希望能得到帮助,从现在的情况调整到更正确的情况,以及关于useradd.c如何使用一些稍有不同的is\u valid\u name函数实现的信息
谢谢!
艾伦
/**
*定义在isNameLinuxCompatible(…)方法中使用的常量。
*
*Linux兼容用户名规则的源代码是“shadow”包中的函数
*对于Linux。该函数的源文件有如下注释:
*用户名/组名必须与[a-z_u2;][a-z0-9_2;-]*[$]匹配
*这个表达有点松散/草率,因为
*(1)尾随的$符号是可选的,并且
*(2)大写字母A-Z也可以(大小写是有效的,'A'!='A')。
*
*我们使用[$]”形式处理(1),其中?表示零个或多个字符(也称为“贪婪”)。
*我们使用不区分大小写的选项来处理(2)。
*
*另一种表达方式是:
*第一个字符:a-z_u至少需要一个字符
*除第一个和最后一个以外的字符:a-z0-9_389;-可选
*最后一个字符:$可选
*最大长度为31。最小长度为1。
*
*注意:下面的初始$和最终$很重要,因为我们需要整个字符串来满足规则,
*从头到尾。
*
*看http://download.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html 有关模式匹配的参考信息。
*/
私有静态最终字符串LINUX_USERNAME_REGEX=“^[a-z_u2;][a-z0-9_2;-]*[$]?$”;
私有静态最终模式LINUX\u USERNAME\u Pattern=Pattern.compile(LINUX\u USERNAME\u REGEX,Pattern.CASE\u不区分大小写);
私有静态final int LINUX_USERNAME_MINLENGTH=1;
私有静态final int LINUX_USERNAME_MAXLENGTH=31;
/**
*查看用户名在长度和长度方面是否与标准Linux用户名规则兼容
*就内容而言。
*
*@param username要检查其有效性的名称
*@如果Linux兼容,则返回true,否则返回false
*/
公共布尔值isNameLinuxCompatible(最终字符串用户名){
布尔名称OK=false;
如果(用户名!=null){
int len=username.length();
if((len>;=LINUX\u USERNAME\u MINLENGTH)&;;(len<;=LINUX\u USERNAME\u MAXLENGTH)){
Matcher m=LINUX\u USERNAME\u PATTERN.Matcher(USERNAME);
nameOK=m.find();
}
}
返回(nameOK);
}
基本gnu/linux用户名是一个32个字符的字符串(useradd(8))。这是BSD 4.3标准的传统格式。passwd(5)添加了一些附加限制,例如,不要使用大写字母,不要使用点,不要以破折号结尾,不能包含冒号
为了安全起见,请遵循C标识符的相同规则:
([a-z_uu][a-z0-9{0,30})
这是问题的一半。现代GNU/Linux发行版使用PAM进行用户身份验证。有了PAM,您可以选择您想要的任何规则和任何数据源
由于您正在编写一个程序,因此最好定义自己的格式,然后使用类似于pam_ldap、pam_mysql等的内容来访问它