Подтвердить что ты не робот

Каковы реальные правила для имен linux на CentOS 6 и RHEL 6?

Я пишу несколько страниц веб-интерфейса, которые можно использовать для создания учетных записей пользователей Linux. Этот веб-интерфейс будет использоваться на CentOS 6 (который получен из RHEL 6). Я нахожу противоречивую и неполную информацию о том, что представляет собой действительное имя пользователя Linux. Я пошел к источнику, изучив исходный пакет shadow-utils Linux, но я не удостоверился, что версия, на которую я смотрела, на самом деле такая же, как и часть CentOS 6.

Ниже представлен фрагмент кода, который я использую в настоящее время, который включает копирование/вставку комментариев из пакета 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);
}
4b9b3361

Ответ 1

Базовое имя пользователя gnu/linux представляет собой строку из 32 символов (useradd(8)). Это устаревший формат из стандарта BSD 4.3. passwd(5) добавляет некоторые дополнительные ограничения, такие как: не используйте заглавные буквы, не используйте точки, не заканчивайте их в тире, он не должен содержать двоеточие.

Чтобы быть в безопасности, следуйте тем же правилам идентификатора C:

([a-z_][a-z0-9_]{0,30})

Эта половина проблемы. Современные дистрибутивы GNU/Linux используют PAM для аутентификации пользователей. С его помощью вы можете выбрать любое правильное решение, а также любой источник данных.

Поскольку вы пишете программу, вам лучше определить свой собственный формат, а затем использовать что-то вроде pam_ldap, pam_mysql и т.д. для доступа к нему.