Что regex должен проверить пользователей Linux?

Или реализуйте свою находку сами ;)

myfind(){ shopt -s nullglob; [[ -f $1 ]] && pwd; for i in */ ; do ( cd $i;myfind $1 ) done }
myfind level.dat
21
25.09.2014, 11:57
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);
}
12
27.01.2020, 19:43

Из справочной страницы useradd (8) :

Обычно рекомендуется использовать только имена пользователей, начинающиеся со строчной буквы или символа подчеркивания, за которым следуют строчные буквы, цифры и символы подчеркивания. , или тире. Они могут заканчиваться знаком доллара. В терминах регулярных выражений: [a-z _] [a-z0-9 _-] * [$]?

В Debian единственными ограничениями являются то, что имена пользователей не должны начинаться с тире ('-') и содержать двоеточие. (':') или пробел (пробел: '', конец строки: '\ n', табуляция: '\ t' и т. д.). Обратите внимание, что использование косой черты ('/') может нарушить алгоритм по умолчанию для определения домашнего каталога пользователя.

Имена пользователей могут содержать не более 32 символов.

Итак, есть общая рекомендация. Фактические ограничения зависят от специфики вашей реализации / распространения. В системах на основе Debian, по-видимому, нет очень жестких ограничений. Фактически, я просто попробовал useradd '€' на моем компьютере с Ubuntu, и это сработало. Конечно, это может сломать некоторые приложения, которые не ожидают таких необычных имен пользователей. Чтобы избежать таких проблем, лучше всего следовать общей рекомендации.

15
27.01.2020, 19:43

Извините за некробампинг этого вопроса, которому уже почти 4 --года, но он занимает довольно высокое место в результатах поиска в Интернете и требует немного большего внимания.

Более точное регулярное выражение (да, я знаю, несмотря на справочную страницу):

^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\$)$

Надеюсь, это поможет некоторым из тех, кто ищет.

Разбить:

  1. Он должен начинаться(^)только со строчной буквы или подчеркивание([a-z_]). Это занимает ровно 1 символ.

  2. Тогда это должно быть одно из либо((... )):

    1. От 0 до 31 символов({0,31})из букв , цифр , подчеркиваний и/ или дефисы ([a-z0-9_-]),

    ИЛИ(|)

    1. От 0 до 30 символов указанного выше плюс знак доллара США(\$)в конце,

    , а затем

  3. Нет больше символов после этого шаблона($).

Те, кто не знаком с регулярными выражениями, могут спросить, почему знак доллара имел обратную косую черту в 2.2, а не в 3. Это потому, что в большинстве (all? )варианты регулярных выражений, знак доллара указывает на конец строки (или строки и т. д. ). В зависимости от используемого движка его нужно будет экранировать, если он является частью фактической строки (Я не могу придумать движок регулярных выражений, который не использует обратную косую черту в качестве экранирования ).

Обратите внимание, что Debian и Ubuntu снимают некоторые ограничения, например, для имени пользователя, полностью совместимого с POSIX/shadow upstream (, и я не знаю, было ли это исправлено, но они позволяют имени пользователя начинаться с цифры – что на самом деле и вызвало эту ошибку). Если вы хотите гарантировать кросс-платформу -,Я бы рекомендовал указанное выше регулярное выражение, а не то, что проходит/не проходит проверку в Debian, Ubuntu и других.

23
27.01.2020, 19:43

Теги

Похожие вопросы