GNU/Linux >> Tutoriales Linux >  >> Linux

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

Lo siento por necrobumpear esta pregunta de hace casi 4 años, pero aparece bastante arriba en los resultados de búsqueda de 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 man):

^[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 (^ ) con solo letras minúsculas o un guión bajo ([a-z_] ). Esto ocupa exactamente 1 personaje.
  2. Entonces debería ser uno de cualquiera (( ... ) ):
    1. Desde 0 a 31 caracteres ({0,31} ) de letras , números , guiones bajos y/o guiones ([a-z0-9_-] ), O (| )
    2. Desde 0 a 30 caracteres de los más anteriores un símbolo de USD (\$ ) al final, y luego
  3. No más personajes pasados 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 tenía 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 un motor de expresiones regulares que no use una barra invertida como escape para una expresión pura) .

Tenga en cuenta que Debian y Ubuntu eliminan algunas restricciones para un nombre de usuario totalmente 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 insecto). Si desea garantizar la 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.


Desde la página man 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 expresiones regulares:[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 inclinada ('/') 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.

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 este tipo de problemas, lo mejor es seguir la recomendación general.


La regla general para el nombre de usuario es que su longitud debe ser inferior a 32 caracteres. Depende de su distribución para hacer lo que es un nombre de usuario válido.

En Debian, shadow-utils 4.1 , hay un 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);
}

Linux
  1. ¿Cuál es el mejor VPS:Windows o Linux?

  2. ¿Cuál es el propósito del grupo "rueda" en Linux?

  3. ¿Cuál es el propósito del archivo .bashrc en Linux?

  4. ¿Cuál es el equivalente a getch() y getche() en Linux?

  5. ¿Cuál es el orden predeterminado de clasificación de Linux?

¿Qué es el comando Watch de Linux + ejemplos?

¿Qué es el Shell en Linux?

¿Cuál es la diferencia entre Linux y Unix?

Los efectos de agregar usuarios a un sistema Linux

Los 10 mejores libros de Linux para leer en 2019

¿Qué es el comando matar en Linux?