Linux kullanıcılarını doğrulamak için normal ifade nedir?


Yanıtlar:


12

Kullanıcı adı için genel kural uzunluğu 32 karakterden az olmalıdır. Geçerli kullanıcı adını oluşturmak dağıtımınıza bağlıdır.

Debian'da, shadow-utils 4.1bir is_valid_nameişlev vardır 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;
}

Ve kullanıcı adının uzunluğu daha önce kontrol edildi:

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);
}

15

Gönderen useradd komutunun (8) man sayfalarına :

Genellikle yalnızca küçük harf veya alt çizgi ile başlayan, ardından küçük harf, rakam, alt çizgi veya tire içeren kullanıcı adlarının kullanılması önerilir. Dolar işareti ile bitebilirler. Normal ifade terimleriyle: [a-z _] [a-z0-9 _-] * [$]?

Debian'da tek kısıtlama, kullanıcı adlarının bir tire ('-') ile başlamaması veya iki nokta üst üste (':') veya boşluk (boşluk: '', satır sonu: '\ n', sekme: 'içermemesidir. \ t 'vb.). Eğik çizgi ('/') kullanmanın, kullanıcının ana dizininin tanımı için varsayılan algoritmayı kırabileceğini unutmayın.

Kullanıcı adları en fazla 32 karakter uzunluğunda olabilir.

Yani, genel bir öneri var. Gerçek kısıtlamalar, uygulamanızın / dağıtımınızın özelliklerine bağlıdır. Debian tabanlı sistemlerde, görünüşe göre çok zor kısıtlamalar yoktur. Aslında, useradd '€'Ubuntu kutumu denedim ve işe yaradı. Tabii ki, bu olağandışı kullanıcı adları beklemeyen bazı uygulamaları kırabilir. Bu tür problemlerden kaçınmak için, genel tavsiyeye uymak en iyisidir.


12

Neredeyse 4 yaşındaki bu soruyu necrobumping için üzgünüm, ancak İnternet arama sonuçlarında oldukça yüksek geliyor ve biraz daha dikkat gerektiriyor.

Daha doğru bir regex (evet, man sayfasına rağmen biliyorum):

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

Umarım bu bazı arama yardımcı olur.

Yıkmak için:

  1. Bu gerektiğini başlatmak ( ^sadece küçük harfli harf veya bir alt çizgi (ile) [a-z_]). Bu tam olarak 1 karakter kaplar .
  2. Sonra olmalı biri arasında ya ( ( ... )):
    1. Dan 0 -e doğru 31 karakterden ( {0,31}) ait harfler , sayılar , alt çizgi ve / veya tire ( [a-z0-9_-]), OR ( |)
    2. Yukarıdakilerin 0 ila 30 karakteri artı sonunda bir USD sembolü ( \$) ve ardından
  3. Bu kalıbı geçecek başka karakter yok ( $).

Normal ifade kalıplarına aşina olmayanlar için, dolar işaretinin neden 2.2'de ters eğik çizgi olduğunu sorabilirsiniz. ancak 3'te olmadı. Bunun nedeni çoğu (tümü?) normal ifade değişkenlerinde dolar işareti bir dizenin (veya satırın vb.) sonunu gösterir. Kullanılan motora bağlı olarak, gerçek dizenin bir parçası ise kaçması gerekir (saf bir ifade için kaçış olarak ters eğik çizgi kullanmayan bir regex motorunun başımın üstünü düşünemiyorum) .

Not Debian ve Ubuntu tam POSIX bazı kısıtlamaları kaldırmak olduğunu / örneğin (memba uyumlu kullanıcı adı gölge ve bu sabit olup olmadığını bilmiyorum, ama adı bir sayı ile başlatmasına izin - aslında neyin sebep olduğu bu hata ). Çapraz platform garantisini vermek istiyorsanız, Debian, Ubuntu ve diğerlerinde kontrolü geçen / başarısız olandan ziyade yukarıdaki regex modelini öneriyorum.


Mükemmel cevap. Java ile de kolayca uygulanabilirjava.util.regex.Pattern.matches("^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\\$)$", user);
dokaspar

Bunun [abcdefghijklmnopqrstuvwxyz]yerine olmalı [a-z]. [a-z]regexp motorlarının çoğunda Macar yerellerinde olduğu gibi é, œhatta bazen çok karakterli harmanlayıcı öğelerle de eşleşir dsz.
Stéphane Chazelas

Linux kullanıcı adları Unicode'u kabul etmez (POSIX uyumluluğunu açıkça yapılandırmak için yapılandırılmadıkları sürece - 1 2 ). Bu denetim, dize doğrulaması değil, girdi / çevre / yerelleştirme doğrulaması olduğundan normal ifadenin dışında yapılmalıdır. Dahası, bunu yapan bir normal ifade motorunun bir örneğini duymak isterim. ASCII'de eşleştiğini bildiğim her biri ve biri destekleniyorsa, Unicode'u açıkça etkinleştirmek zorunda.
brent saner
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.