GNU/Linux >> Znalost Linux >  >> Linux

Jaký je regulární výraz pro ověření uživatelů Linuxu?

Omlouvám se, že jsem tuto téměř 4 roky starou otázku znehodnotil, ale ve výsledcích vyhledávání na internetu se objevuje dost vysoko a zaslouží si trochu více pozornosti.

Přesnější regulární výraz je (ano, vím, navzdory manuálové stránce):

^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\$)$

Doufám, že to pomůže některým z těch, kteří hledají.

Chcete-li to rozebrat:

  1. Mělo by to spustit (^ ) pouze s malými písmeny nebo podtržítky ([a-z_] ). To zabírá přesně 1 postava.
  2. Pak by to mělo být jedna z buď (( ... ) ):
    1. Od 0 do 31 znaků ({0,31} ) z písmen , čísla , podtržítka a/nebo pomlčky ([a-z0-9_-] ), NEBO (| )
    2. Od 0 do 30 znaky z výše uvedeného plus symbol USD (\$ ) na konci a poté
  3. Žádné další znaky minulé tento vzor ($ ).

Pro ty, kteří neznají vzory regulárních výrazů, se můžete zeptat, proč měl znak dolaru v 2.2 zpětné lomítko. ale ne ve 3. Je to proto, že ve většině (všech?) variantách regulárních výrazů znak dolaru označuje konec řetězce (nebo řádku atd.). V závislosti na použitém enginu bude muset být escapován, pokud je součástí skutečného řetězce (nedokážu si z hlavy vymyslet motor regulárních výrazů, který nepoužívá zpětné lomítko jako únik pro čistý výraz) .

Všimněte si, že Debian a Ubuntu odstraňují některá omezení pro uživatelské jméno plně kompatibilní s POSIX/shadow upstream (například a nevím, zda to bylo opraveno, ale umožňují, aby uživatelské jméno začínalo číslem - což je ve skutečnosti to, co to způsobilo Chyba). Pokud chcete zaručit multiplatformní přístup, doporučoval bych spíše výše uvedený vzor regulárního výrazu než to, co projde/neprojde kontrolou v Debianu, Ubuntu a dalších.


Z manuálové stránky useradd (8):

Obvykle se doporučuje používat pouze uživatelská jména, která začínají malým písmenem nebo podtržítkem, za nímž následují malá písmena, číslice, podtržítka nebo pomlčky. Mohou končit znakem dolaru. Vyjádřeno regulárním výrazem:[a-z_][a-z0-9_-]*[$]?

V Debianu je jediným omezením to, že uživatelská jména nesmí začínat pomlčkou ('-') ani obsahovat dvojtečku (':') nebo mezeru (mezera:' ', konec řádku:'\n', tabulka:' \t' atd.). Všimněte si, že použití lomítka ('/') může narušit výchozí algoritmus pro definici domovského adresáře uživatele.

Uživatelská jména mohou mít maximálně 32 znaků.

Existuje tedy obecné doporučení. Skutečná omezení závisí na specifikách vaší implementace/distribuce. Na systémech založených na Debianu zjevně neexistují žádná velmi tvrdá omezení. Ve skutečnosti jsem právě zkusil useradd '€' na mém Ubuntu boxu a fungovalo to. To samozřejmě může zlomit některé aplikace, které neočekávají tak neobvyklá uživatelská jména. Chcete-li se těmto problémům vyhnout, je nejlepší řídit se obecným doporučením.


Obecným pravidlem pro uživatelské jméno je, že jeho délka musí být kratší než 32 znaků. To, co je platné uživatelské jméno, závisí na vaší distribuci.

V Debianu shadow-utils 4.1 , je zde is_valid_name funkce v 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;
}

A délka uživatelského jména byla zkontrolována dříve:

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. Co dělá Linux udržitelným OS

  2. Linux vs. Unix:Jaký je rozdíl?

  3. Co je Linux? Průvodce pro netechnické uživatele

  1. Jaké je nejlepší VPS:Windows nebo Linux?

  2. Jaký je ekvivalent getch() &getche() v Linuxu?

  3. Jaká je definice relace v linuxu?

  1. Čím je linuxová komunita výjimečná?

  2. Jaká je aktuální úroveň běhu systému Linux?

  3. Jaký je účel skupiny „wheel“ v Linuxu