¿Cuál es la expresión regular para validar a los usuarios de Linux?

21

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?

Ionică Bizău
fuente

Respuestas:

12

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.1hay una is_valid_namefunció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);
}
Cuonglm
fuente
15

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.

Malte Skoruppa
fuente
12

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:

  1. Debe comenzar ( ^) solo con letras minúsculas o un guión bajo ( [a-z_]). Esto ocupa exactamente 1 personaje.
  2. Entonces debería ser uno de los siguientes ( ( ... )):
    1. De 0 a 31 caracteres ( {0,31}) de letras , números , guiones bajos y / o guiones ( [a-z0-9_-]), O ( |)
    2. De 0 a 30 caracteres de lo anterior más un símbolo USD ( \$) al final, y luego
  3. No más personajes pasan este patrón ( $).

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.

Brent Saner
fuente
Gran respuesta. Se puede aplicar fácilmente también en Java usandojava.util.regex.Pattern.matches("^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\\$)$", user);
dokaspar
Debería ser en [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 dszen los entornos locales húngaros.
Stéphane Chazelas
Los nombres de usuario de Linux no aceptan Unicode (a menos que estén configurados explícitamente para romper el cumplimiento POSIX - 1 2 ). Esta verificación debe hacerse fuera de la expresión regular, ya que es una validación de entrada / entorno / localización, no una validación de cadena. Además, me encantaría escuchar un ejemplo de un motor regex que hace esto. Todos los que conozco coinciden en ASCII y uno tiene que habilitar explícitamente Unicode, incluso si es compatible.
brent saner