[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.
======( )===( )=============
\ ( ) /
\_) (_/
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- mkpasswd.awk --- Um clone do mkpasswd ...,
.:::: Marcio ::::. <=