shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

mkpasswd.awk --- Um clone do mkpasswd ...


From: .:::: Marcio ::::.
Subject: mkpasswd.awk --- Um clone do mkpasswd ...
Date: Fri, 25 Jun 2004 16:00:50 -0300

Oi Pessoal,

        Abaixo, um clone (modesto) do programa 'mkpasswd' do
 pacote 'expect',feito puramente através da linguagem 'awk'. 
        
        Algumas vantagens:
        - Gera senhas mais rápido;
        - faz as operações mais utilizadas do 'mkpasswd' original;
        - metade do tamanho do programa original;
        - não precisa ter o expect instalado. 

        Apenas...

        # chmod +x mkpasswd.awk
        # ln -s mkpasswd.awk /usr/bin/mkpasswd
        
        
        Exemplo:

        $ mkpasswd -l10 -C4 -d3 -s0
        -| A362mGhBR

        OBS.:
                Não se separa os parâmetros das opções (-l20 NÃO -l 20).

        Para nós que gostamos da linguagem ...



######### INICIO DO SCRIPT #############
#!/bin/awk -f

# mkpasswd.awk --- Um clone do mkpasswd do pacote Expect
#
# Márcio Mendonça --- address@hidden 
# 20-jun-2004
# 

# 'errmsg()' --- Emite uma mensagem de uso do script e retorna 1.
function errmsg()
{
        print "usage: awk -f mkpasswd.awk [args]" > "/dev/stderr"
        print "  where arguments are:" > "/dev/stderr"
        printf "  -l #\t(length of password, default = 9)\n\
  -d #\t(min # of digits, default = 2)\n\
  -c #\t(min # of lowercase chars, default = 2)\n\
  -C #\t(min # of uppercase chars, default = 2)\n\
  -s #\t(min # of special chars, default = 1)\n " > "/dev/stderr"
        exit 1
}

# aleat()  --- Gera uma string aleatória
function aleat(quant,           lower, lower_vet, aleato, aleatos)
{
        lower = "abcdefghijklmnopqrstuvwyxz"
        split(lower, lower_vet, "")
        
                for(i = 1; i <= quant; i++){
                        aleatos = lower_vet[int(rand() * 25) + 1]

                        # Evitando seqüências repetidas de caracteres para
                        # geração de senhas melhores.
                        while(aleatos == substr(aleato, length(aleato)))
                                aleatos = lower_vet[int(rand() * 25) + 1]
                        
                        aleato = (aleato aleatos)
                }

        return aleato
}

BEGIN\
{
        srand()

        def_len = 9
        def_up = def_di = 2
        def_sp = 1

        lower = "abcdefghijklmnopqrstuvwyxz"
        upper = toupper(lower)
        digit = "0123456789"
        special = "|,.;/<>:?][}{'`^~!@#$%&*-_+="

        # Verificando a existências de opções na linha de comandos...
        if(ARGC > 1)
                for(i = 1; i <= ARGC; i++)
                        if(ARGV[i] ~ /^-/){
                                op[i] = substr(ARGV[i], 2)
                                ARGV[i] = ""
                        }

        # Recolhendo os parâmetros das opções...
        for(o in op){
                if(substr(op[o], 1, 1) !~ /[ldCcs]/) # Opção desconhecida? 
                        errmsg()

                opt[substr(op[o], 1, 1)] = substr(op[o], 2)
                
        }

                if(opt["l"]) # Se a opção "l" existir altera o default (def_len)
                        def_len = int(opt["l"])

                if(opt["C"]) # Se a opção "C" existir altera o default (def_up)
                        def_up = int(opt["C"])

                if(opt["d"]) # Se a opção "d" existir altera o default (def_di)
                        def_di = int(opt["d"])
                        
                if(opt["s"]) # Se a opção "s" existir altera o default (def_sp)
                        def_sp = int(opt["s"])
        
        # Gerando um string aleatória com a quantidade especificada 
        # por def_len
                passwd = aleat(def_len) 

        # picando tudo...
                split(passwd, p, "")
                split(upper, u, "")
                split(digit, d, "")
                split(special, s, "")
                
                # Colocando os números aleatórios em posições aleatórias...
                while(r < def_di){
                        dig = d[int(rand() * 10) + 1]
                        al = p[int(rand() * def_len) + 1]

                        # Evitando números repetidos em senhas com menos de 
                        # dez dígitos..
                        if(def_di <= 10)
                                while(passwd ~ dig)
                                        dig = d[int(rand() * 10) + 1]

                        sub(al, dig, passwd)
                        r++
                }
                
                
                split(passwd, p, "") # Redividindo a senha alterada

                
                # Colocando letras maiúsculas aleatórias em posições 
aleatórias...
                while(x < def_up){
                        al = p[int(rand() * def_len) + 1]
                        dig = u[int(rand() * 25) + 1]
                        
                        # NÃO substituir os números por maiusculas.
                        while(al ~ /[[:digit:]]/) al = p[int(rand() * def_len) 
+ 1]

                        # Evitando seqüência de letras maiúsculas repetidas...
                        while(passwd ~ dig)
                                dig = u[int(rand() * 24) + 1]

                        sub(al, dig, passwd)
                        x++
                }


                split(passwd, p, "") # Redividindo a senha alterada

                if(def_sp != 0){
                                while(w < def_sp){
                                        spe = s[int(rand() * 28) + 1]
                                        al = p[int(rand() * def_len) + 1]
                                
                                        while(al ~ /[[:upper:]]/ || al ~ 
/[[:digit:]]/)
                                                al = p[int(rand() * def_len) + 
1]
                                                
                                        sub(al, spe, passwd)
                                        w++
                }
        }
        print passwd
}
############### FIM DO SCRIPT #############

        Alterações, sugestões, criticas, por favor mail-me.


        [ ]'s


------
            ////
          ( O O )
=======oOO==(_)==OOo============
 Márcio Alexandre S. Mendonça
 address@hidden
 Linux User #298595
      .oooO   Oooo.
======(   )===(   )=============
       \ (     ) /
        \_)   (_/


reply via email to

[Prev in Thread] Current Thread [Next in Thread]