Що таке регулярний вимір для перевірки користувачів Linux?


Відповіді:


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);
}

15

На головній сторінці useradd (8) :

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

У Debian єдиними обмеженнями є те, що імена користувачів не повинні починатися з тире ('-'), а також не містити двокрапки (':') або пробілу (пробіл: '', кінець рядка: '\ n', табуляція: ' \ t 'тощо). Зауважте, що використання косої риски ('/') може порушити алгоритм за замовчуванням для визначення домашнього каталогу користувача.

Імена користувачів можуть містити не більше 32 символів.

Отже, є загальна рекомендація. Фактичні обмеження залежать від специфіки вашої реалізації / розповсюдження. У системах на базі Debian, мабуть, немає дуже важких обмежень. Насправді я просто приміряв useradd '€'свій Ubuntu box, і він спрацював. Звичайно, це може зламати деякі програми, які не очікують таких незвичних імен користувачів. Щоб уникнути подібних проблем, краще дотримуватися загальної рекомендації.


12

Вибачте за некробумінг цього майже 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_-]), АБО ( |)
    2. Від 0 до 30 символів вище плюс символ USD ( \$) в кінці, а потім
  3. Немає більше символів в минулому цієї моделі ( $).

Тим, хто не знайомий з малюнками регулярних виразів, ви можете запитати, чому знак долара мав зворотний косий рядок у 2.2. але не в 3. Це тому, що в більшості (усіх?) варіантів виразів знак долара вказує кінець рядка (або рядка тощо). Залежно від використовуваного двигуна, його потрібно буде уникнути, якщо це частина фактичної струни (я не можу придумати верхню частину голови двигуна регулярного випромінювання, який не використовує зворотну косу рису як виклик для чистого виразу) .

Зауважте, що Debian і Ubuntu знімають деякі обмеження для повністю сумісного імені користувача, сумісного для POSIX / тіні (наприклад, і я не знаю, чи це було виправлено, але вони дозволяють ім'я користувача починати з числа - що насправді це спричинило це помилка ). Якщо ви хочете гарантувати крос-платформу, я б рекомендував вищевказаний шаблон регулярного вираження, а не те, що проходить / не дає перевірки в 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]у багатьох двигунах regexp також відповідають такі елементи, як é, œа то й іноді, багатозначні елементи, що складаються, як dszу угорських мовах.
Стефан Шазелас

Імена користувачів Linux не приймають Unicode (якщо вони явно не налаштовані для порушення відповідності POSIX - 1 2 ). Ця перевірка повинна проводитися за межами регулярного вираження, оскільки це введення / середовище / локалізація, а не перевірка рядків. Далі я хотів би почути приклад двигуна регулярних викидів, який це робить. Усі, що я знаю, збігаються на ASCII і повинні явно включити Unicode, якщо він навіть підтримується.
brent saner
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.