Al agregar un nuevo usuario, ¿cómo se valida la cadena?
Supongo que hay una expresión regular. ¿Cuál es esa expresión regular?
Al agregar un nuevo usuario, ¿cómo se valida la cadena?
Supongo que hay una expresión regular. ¿Cuál es esa expresión regular?
Respuestas:
La regla general para el nombre de usuario es que su longitud debe tener menos de 32 caracteres. Depende de su distribución hacer lo que es un nombre de usuario válido.
En Debian, shadow-utils 4.1
hay una is_valid_name
función en 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;
}
Y la longitud del nombre de usuario se verificó antes:
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);
}
Desde la página de manual de useradd (8) :
Por lo general, se recomienda usar solo nombres de usuario que comiencen con una letra minúscula o un guión bajo, seguidos de letras minúsculas, dígitos, guiones bajos o guiones. Pueden terminar con un signo de dólar. En términos de expresión regular: [a-z _] [a-z0-9 _-] * [$]?
En Debian, las únicas restricciones son que los nombres de usuario no deben comenzar con un guión ('-') ni contener dos puntos (':') o un espacio en blanco (espacio: '', final de línea: '\ n', tabulación: ' \ t ', etc.). Tenga en cuenta que el uso de una barra diagonal ('/') puede romper el algoritmo predeterminado para la definición del directorio de inicio del usuario.
Los nombres de usuario solo pueden tener hasta 32 caracteres de longitud.
Entonces, hay una recomendación general. Las restricciones reales dependen de los detalles de su implementación / distribución. En los sistemas basados en Debian, aparentemente no hay restricciones muy estrictas. De hecho, acabo de probar useradd '€'
en mi caja de Ubuntu, y funcionó. Por supuesto, esto puede romper algunas aplicaciones que no esperan nombres de usuario tan inusuales. Para evitar tales problemas, es mejor seguir la recomendación general.
Perdón por negar esta pregunta de casi 4 años, pero aparece bastante arriba en los resultados de búsqueda en Internet y merece un poco más de atención.
Una expresión regular más precisa es (sí, lo sé, a pesar de la página de manual):
^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\$)$
Esperemos que eso ayude a algunos de los que buscan.
Para desglosarlo:
^
) solo con letras minúsculas o un guión bajo ( [a-z_]
). Esto ocupa exactamente 1 personaje.( ... )
):
{0,31}
) de letras , números , guiones bajos y / o guiones ( [a-z0-9_-]
), O ( |
)\$
) al final, y luego$
).Para aquellos que no están familiarizados con los patrones de expresiones regulares, puede preguntar por qué el signo de dólar tuvo una barra invertida en 2.2. pero no en 3. Esto se debe a que en la mayoría de las variantes de expresiones regulares (¿todas?), el signo de dólar indica el final de una cadena (o línea, etc.). Dependiendo del motor que se use, será necesario escapar si es parte de la cadena real (no puedo pensar en la parte superior de mi cabeza de un motor de expresiones regulares que no usa la barra invertida como un escape para una expresión pura) .
Tenga en cuenta que Debian y Ubuntu eliminan algunas restricciones para un nombre de usuario compatible con POSIX / shadow upstream (por ejemplo, y no sé si esto se ha solucionado, pero permiten que el nombre de usuario comience con un número, que en realidad es lo que causó esto error ) Si desea garantizar multiplataforma, recomendaría el patrón de expresiones regulares anterior en lugar de lo que pasa / falla la verificación en Debian, Ubuntu y otros.
[abcdefghijklmnopqrstuvwxyz]
lugar de [a-z]
. [a-z]
en muchos motores regexp también coincide con elementos como é
, œ
o incluso a veces, elementos de clasificación de varios caracteres como dsz
en los entornos locales húngaros.
java.util.regex.Pattern.matches("^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\\$)$", user);