Додаючи нового користувача, як підтверджується рядок?
Я гадаю, є регулярний вираз. Що це за регулярний вираз?
Додаючи нового користувача, як підтверджується рядок?
Я гадаю, є регулярний вираз. Що це за регулярний вираз?
Відповіді:
Загальне правило для імені користувача - його довжина повинна бути менше 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);
}
На головній сторінці useradd (8) :
Зазвичай рекомендується використовувати лише імена користувачів, які починаються з малої літери або підкреслення, з наступними малими літерами, цифрами, підкресленнями або тире. Вони можуть закінчуватися знаком долара. У регулярних виразах: [a-z _] [a-z0-9 _-] * [$]?
У Debian єдиними обмеженнями є те, що імена користувачів не повинні починатися з тире ('-'), а також не містити двокрапки (':') або пробілу (пробіл: '', кінець рядка: '\ n', табуляція: ' \ t 'тощо). Зауважте, що використання косої риски ('/') може порушити алгоритм за замовчуванням для визначення домашнього каталогу користувача.
Імена користувачів можуть містити не більше 32 символів.
Отже, є загальна рекомендація. Фактичні обмеження залежать від специфіки вашої реалізації / розповсюдження. У системах на базі Debian, мабуть, немає дуже важких обмежень. Насправді я просто приміряв useradd '€'
свій Ubuntu box, і він спрацював. Звичайно, це може зламати деякі програми, які не очікують таких незвичних імен користувачів. Щоб уникнути подібних проблем, краще дотримуватися загальної рекомендації.
Вибачте за некробумінг цього майже 4-річного питання, але він підходить досить високо в результатах пошуку в Інтернеті, і це вимагає трохи більше уваги.
Більш точний регулярний вираз (так, я знаю, незважаючи на сторінку людини):
^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\$)$
Будемо сподіватися, що це допомагає деяким з тих, хто шукає.
Щоб розбити його:
^
) лише з малих літер або підкреслення ( [a-z_]
). Це займає рівно 1 символ.( ... )
):
{0,31}
) букв , цифр , підкреслення та / або дефісів ( [a-z0-9_-]
), АБО ( |
)\$
) в кінці, а потім$
).Тим, хто не знайомий з малюнками регулярних виразів, ви можете запитати, чому знак долара мав зворотний косий рядок у 2.2. але не в 3. Це тому, що в більшості (усіх?) варіантів виразів знак долара вказує кінець рядка (або рядка тощо). Залежно від використовуваного двигуна, його потрібно буде уникнути, якщо це частина фактичної струни (я не можу придумати верхню частину голови двигуна регулярного випромінювання, який не використовує зворотну косу рису як виклик для чистого виразу) .
Зауважте, що Debian і Ubuntu знімають деякі обмеження для повністю сумісного імені користувача, сумісного для POSIX / тіні (наприклад, і я не знаю, чи це було виправлено, але вони дозволяють ім'я користувача починати з числа - що насправді це спричинило це помилка ). Якщо ви хочете гарантувати крос-платформу, я б рекомендував вищевказаний шаблон регулярного вираження, а не те, що проходить / не дає перевірки в Debian, Ubuntu та інших.
[abcdefghijklmnopqrstuvwxyz]
замість [a-z]
. [a-z]
у багатьох двигунах regexp також відповідають такі елементи, як é
, œ
а то й іноді, багатозначні елементи, що складаються, як dsz
у угорських мовах.
java.util.regex.Pattern.matches("^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\\$)$", user);