Что такое регулярное выражение для проверки пользователей Linux?

21

Как добавляется новый пользователь при проверке строки?

Я предполагаю, что есть регулярное выражение. Что это за регулярное выражение?

Ионика Бизэу
источник

Ответы:

12

Общее правило для имени пользователя: его длина должна быть не более 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);
}
cuonglm
источник
15

Со страницы руководства пользователя useradd (8) :

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

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

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

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

Malte Skoruppa
источник
12

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

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

^[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_-]), ИЛИ ( |)
    2. От 0 до 30 символов выше плюс символ доллара ( \$) в конце, а затем
  3. Нет больше символов за этим шаблоном ( $).

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

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

Брент Санер
источник
Отличный ответ. Может быть легко применен также в Java с помощьюjava.util.regex.Pattern.matches("^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\\$)$", user);
dokaspar
Это должно быть [abcdefghijklmnopqrstuvwxyz]вместо [a-z]. [a-z]во многих двигателях регулярных выражений также совпадают такие вещи, как é, œили даже иногда, многосимвольные элементы сопоставления, как dszв венгерских локалях.
Стефан Шазелас
Имена пользователей Linux не принимают Unicode (если они явно не настроены на нарушение соответствия POSIX - 1 2 ). Эта проверка должна выполняться вне регулярного выражения, так как это проверка входных данных / среды / локализации, а не проверка строк. Кроме того, я хотел бы услышать пример движка регулярных выражений, который делает это. Все, что я знаю, совпадают в ASCII, и нужно явно включить Unicode, если он даже поддерживается.
Брент Санер