Как добавляется новый пользователь при проверке строки?
Я предполагаю, что есть регулярное выражение. Что это за регулярное выражение?
Как добавляется новый пользователь при проверке строки?
Я предполагаю, что есть регулярное выражение. Что это за регулярное выражение?
Ответы:
Общее правило для имени пользователя: его длина должна быть не более 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', табуляция: ' т и т. д.). Обратите внимание, что использование косой черты ('/') может нарушить алгоритм по умолчанию для определения домашнего каталога пользователя.
Имя пользователя может быть длиной до 32 символов.
Итак, есть общая рекомендация. Фактические ограничения зависят от специфики вашей реализации / распространения. В системах на основе Debian, по-видимому, нет очень жестких ограничений. На самом деле, я только что попробовал useradd '€'
свою коробку с Ubuntu, и это сработало. Конечно, это может сломать некоторые приложения, которые не ожидают таких необычных имен пользователей. Чтобы избежать таких проблем, лучше всего следовать общей рекомендации.
Извините за то, что я отказался от этого почти четырехлетнего вопроса, но в результатах поиска в Интернете он поднимается довольно высоко и требует немного большего внимания.
Более точное регулярное выражение (да, я знаю, несмотря на справочную страницу):
^[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 / shadow upstream-совместимого имени пользователя (например, и я не знаю, было ли это исправлено, но они позволяют имени пользователя начинаться с цифры - что на самом деле является причиной этого ошибка ). Если вы хотите гарантировать кроссплатформенность, я рекомендую использовать приведенный выше шаблон регулярных выражений, а не то, что проходит / не проходит проверку в Debian, Ubuntu и других.
[abcdefghijklmnopqrstuvwxyz]
вместо [a-z]
. [a-z]
во многих двигателях регулярных выражений также совпадают такие вещи, как é
, œ
или даже иногда, многосимвольные элементы сопоставления, как dsz
в венгерских локалях.
java.util.regex.Pattern.matches("^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\\$)$", user);