Я пишу несколько страниц веб-интерфейса, которые можно использовать для создания учетных записей пользователей Linux. Этот веб-интерфейс будет использоваться в CentOS 6 (производном от RHEL 6). Я нахожу непоследовательную и неполную информацию о том, что составляет действительное имя пользователя Linux. Я пошел к источнику, изучив исходный пакет Linux shadow-utils, но не удостоверился, что версия, которую я просматриваю, на самом деле такая же, как та, которая является частью CentOS 6.
Ниже приведен фрагмент кода, который я сейчас использую. use, который включает в себя копирование / вставку комментариев из пакета shadow-utils версии 4.1.4.3, а также некоторые из моих собственных заметок и поиск регулярных выражений Java в соответствии с моим пониманием при просмотре источника shadow-utils.
указанная проверка is_valid_name () в chkname.c, очевидно, не то, что используется командой useradd в Linux, поскольку комментарии (и исходный код C-кода) не допускают имен, начинающихся с числа. Однако useradd позволяет создать учетную запись типа «1234».
Я был бы признателен за помощь в изменении того, что у меня есть сейчас, на то, что было бы более правильным, а также информацию о том, как useradd.c реализован с некоторыми незначительными другая функция is_valid_name.
Спасибо! Алан
/**
* Define constants for use in isNameLinuxCompatible(...) method.
*
* The source for the Linux compatible user name rule is is_valid_name(...) a function in the "shadow" package
* for Linux. The source file for that function has a comment as follows:
* User/group names must match [a-z_][a-z0-9_-]*[$]
* That expression is a little loose/sloppy since
* (1) the trailing $ sign is optional, and
* (2) uppercase A-Z is also ok (and case is significant, 'A' != 'a').
*
* We deal with (1) by using the [$]? form where the ? means zero or more characters (aka "greedy").
* We deal with (2) by using the CASE_INSENSITIVE option.
*
* Another way to express this is:
* 1st character: a-z_ required at least one char
* chars other than first and last: a-z0-9_- optional
* last character: $ optional
* Max length is 31. Min length is 1.
*
* NOTE: The initial ^ and final $ below are important since we need the entire string to satisfy the rule,
* from beginning to end.
*
* See http://download.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html for reference info on pattern matching.
*/
private static final String LINUX_USERNAME_REGEX = "^[a-z_][a-z0-9_-]*[$]?$";
private static final Pattern LINUX_USERNAME_PATTERN = Pattern.compile(LINUX_USERNAME_REGEX, Pattern.CASE_INSENSITIVE);
private static final int LINUX_USERNAME_MINLENGTH = 1;
private static final int LINUX_USERNAME_MAXLENGTH = 31;
/**
* See if username is compatible with standard Linux rules for usernames, in terms of length and
* in terms of content.
*
* @param username the name to be checked for validity
* @return true if Linux compatible, else false
*/
public boolean isNameLinuxCompatible (final String username) {
boolean nameOK = false;
if (username != null) {
int len = username.length();
if ((len >= LINUX_USERNAME_MINLENGTH) && (len <= LINUX_USERNAME_MAXLENGTH)) {
Matcher m = LINUX_USERNAME_PATTERN.matcher(username);
nameOK = m.find();
}
}
return (nameOK);
}