Como root, você pode definir sistematicamente a senha de um usuário por meio de um script usando este método:
$ echo -n "$passwd" | passwd "$uname" --stdin
Gerando senhas
Eu gosto de usar a ferramenta de linha de comando pwgen
para gerar senhas.
$ passwd="'pwgen -1cny | sed 's/[\$\!]/%/g''"
$ pwgen --help
Usage: pwgen [ OPTIONS ] [ pw_length ] [ num_pw ]
Options supported by pwgen:
-c or --capitalize
Include at least one capital letter in the password
-A or --no-capitalize
Don't include capital letters in the password
-n or --numerals
Include at least one number in the password
-0 or --no-numerals
Don't include numbers in the password
-y or --symbols
Include at least one special symbol in the password
-s or --secure
Generate completely random passwords
-B or --ambiguous
Don't include ambiguous characters in the password
-h or --help
Print a help message
-H or --sha1=path/to/file[#seed]
Use sha1 hash of given file as a (not so) random generator
-C
Print the generated passwords in columns
-1
Don't print the generated passwords in columns
-v or --no-vowels
Do not use any vowels so as to avoid accidental nasty words
Mas isso não é inseguro?
Não. A senha está sendo passada via STDIN para passwd
, embora seja possível alguém espionar os processos via ps
, mesmo que isso não permita que um usuário veja os processos do root, a entrega da senha para passwd
está bloqueado.
Exemplo
Digamos que eu execute este comando em um terminal como root:
$ ( sleep 10; echo "supersecret" | passwd "samtest" --stdin ) &
[1] 13989
Eu então executo ps
em outro terminal:
$ ps -AOcmd | grep pass
14046 passwd samtest --stdin R pts/11 00:00:00 passwd samtest --stdin
Após a alteração da senha no primeiro terminal:
[root@greeneggs ~]# Changing password for user samtest.
passwd: all authentication tokens updated successfully.
E sobre o eco a passar?
Mesmo isso não vaza a senha. Aqui está outro teste demonstrando isso. Primeiramente nós começamos este comando em um terminal secundário. Isso coletará a saída de ps
.
$ while [ 1 ]; do ps -eaf2>&1 | grep -E "echo|pass";done | tee ps.txt
Em seguida, executamos nosso comando de configuração de senha:
$ echo "supersecret" | passwd "samtest" --stdin &
[1] 20055
$ Changing password for user samtest.
passwd: all authentication tokens updated successfully.
[1]+ Done echo "supersecret" | passwd "samtest" --stdin
A verificação do conteúdo de ps.txt
mostra que a senha não vazou:
$ grep supersecret ps.txt
$
Alterar o comando ps
que usamos para ps -eaf
também não o vaza.