2010-11-18 28 views
2

Bir BASH komut dosyasında aşağıdaki düzenli ifadeleri nasıl kullanabilirim?Güçlü parola için Bash regex

  1. en az bir sermaye Mektubu:

    (?=^.{8,255}$)((?=.*\d)(?!.*\s)(?=.*[A-Z])(?=.*[a-z]))^.* 
    

    aşağıdaki için kullanıcı girişi (şifre) kontrol etmek gerekir. En az bir sayı için

  2. .
  3. En az bir küçük harf.
  4. ve parola 8 ile 255 karakter arasında olmalıdır.

cevap

1

Normal ifadenizin listenizdeki öğeleri kontrol etmenin en iyi (veya doğru?) Yolu olduğunu sanmıyorum (ipucu: diğer koşullardan bağımsız olarak uzunluğu kontrol ediyorum), ancak Bash kullanmaktan ilgili soruyu cevaplamak için: grep -Eq dönüş değeri, örneğin kullanın: Bash 3'te Alternatif

if echo "$candidate_password" | grep -Eq "$strong_pw_regex"; then 
    echo strong 
else 
    echo weak 
fi 

ve daha sonra =~ operatörünü kullanabilirsiniz:

if [[ "$candidate_password" =~ "$strong_pw_regex" ]]; then 
    … 
fi 

ait regexp'in sözdizimi grep -E veya Bash, örneğinizde kullandığınız her şeyi desteklemeyebilir, ancak gereksinimlerinizi de kontrol etmek mümkündür. Fakat meraklı ifadeler istiyorsanız, muhtemelen Bash için Ruby ya da Perl gibi bir şey değiştirmeniz gerekecektir.

Düzenli ifadenizi değiştirmek için, Bash ile uzunluğu kontrol edin (${#candidate_password}, candidate_password değişkenindeki dizenin uzunluğunu verir) ve daha sonra lookahead olmadan basit bir sözdizimi kullanın. Basitlik için her üç koşulu ayrı düzenli ifadelerle bile kontrol edebilirsiniz. -E seçeneğiyle

+0

'yankı-weak' yeni bir etiket olmalıdır ... yorum için İt's-hep-Cuma-in-iceland' – beggs

+0

teşekkür' yanında gitmek ama benim yaptığım gibi bu bash yapılması gereken etmek Başka şeyler yapan bir betik. – Debianuser

+0

Açıkçası, 'grep' çağrısına benzer bir sorun değilse, Bash komut dosyanızdan 'ruby' veya 'perl' diyebilirsiniz. Ya da saf Bash'i kastediyorsanız, '= ~' kullanın (Bash 3.x minimumunu kabul edebileceğinizi varsayarak), ancak normal ifadenizi (grep' için de aynı) değiştirmeniz gerekecektir. – Arkku

0

grep ileriye bakma desteklemez bu documentation ERE itibaren Genişletilmiş normal ifade (ERE)
kullanır.

Yani olarak bunun için Perl kullanabilirsiniz: Sana regex aradığınız olsun

perl -ne 'exit 1 if(/(?=^.{8,255}$)((?=.*\\d)(?=.*[A-Z])(?=.*[a-z])|(?=.*\\d)(?=.*[^A-Za-z0-9])(?=.*[a-z])|(?=.*[^A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z])|(?=.*\\d)(?=.*[A-Z])(?=.*[^A-Za-z0-9]))^.*/);exit 0;' 

Ideone Link

0

ancak PAM modülü aracılığıyla yapıyor düşünün mı? quality

dictionary

    • diğer ilginç modüller olabilir.

  • +0

    Öneriniz için teşekkürler, ancak betiğimi basit tutmak istiyorum ve bunun başka bir modüle veya Perl gibi bir programlama diline bağımlı olmasını istemiyorum. – Debianuser

    0

    Bu eşleşmeler, mantıksal AND operatörü ile bağlanır; bu, hepsinin eşleştiği tek iyi eşleşmedir. Bu nedenle, en basit yol, zincirlenen bu koşulların eşleştirilmesidir, önceki sonuç bir sonraki ifadeye aktarılır.kibrit herhangi başarısız olursa Ardından, tüm ifade başarısız: Farklı sistem yerel ayarlar [aabbcc olarak kullanabiliriz çünkü

    $echo "tEsTstr1ng" | egrep "^.{8,255}"| egrep "[ABCDEFGHIJKLMNOPQRSTUVWXYZ]"| egrep "[abcdefghijklmnopqrstuvwxyz"] | egrep "[0-9]" 
    

    el "[az]", "[AZ]" yerine tüm karakterleri girdi ve .. ., bir maçta iki şarttır ve 'un hem koşullarını kontrol etmemiz gerekir. kabuk gibi

    :

    #!/bin/sh 
    a="tEsTstr1ng" 
    b=`echo $a | egrep "^.{8,255}" | \ 
          egrep "[ABCDEFGHIJKLMNOPQRSTUVWXYZ]" | \ 
          egrep "[abcdefghijklmnopqrstuvwxyz"] | \ 
          egrep "[0-9]"` 
    # now featuring W in the alphabet string 
    #if the result string is empty, one of the conditions has failed 
    if [ -z $b ] 
        then 
        echo "Conditions do not match" 
        else 
        echo "Conditions match" 
    fi 
    
    +0

    Yukarıdaki kod, aradığım şey. Çok teşekkürler! – Debianuser

    2

    grep sürümünüz o PCRE'yi (Perl-Uyumlu Normal İfadeler destekler -P seçenek

    grep -P '(?=^.{8,255}$)(?=^[^\s]*$)(?=.*\d)(?=.*[A-Z])(?=.*[a-z])' 
    

    Ben boşlukları reddetmek için ifadeyi değiştirmek zorunda kalırsa. her zaman başarısız olduğundan fazladan parantezler gerekli görünmüyordu, sonunda her zaman eşleştiğinden beri ^.*'u bıraktım ve gerçekten sadece boolean sonucuna ihtiyacın var:

    while ! echo "$password" | grep -P ... 
    do 
        read -r -s -p "Please enter a password: " password 
    done