L'unica soluzione funziona su Ubuntu 12.04:
echo -e "new_password\nnew_password" | (passwd user)
Ma la seconda opzione funziona solo quando cambio da:
echo "password:name" | chpasswd
A:
echo "user:password" | chpasswd
Vedi le spiegazioni nel post originale:Modifica della password tramite uno script
Leggi le sagge parole da:
- http://mywiki.wooledge.org/BashFAQ/078
Cito:
Niente di ciò che puoi fare in bash può funzionare. passwd(1) non legge dallo standard input. Questo è intenzionale. È per la tua protezione. Le password non sono mai state pensate per essere inserite nei programmi o generate dai programmi. Dovevano essere inseriti solo dalle dita di un vero essere umano, con un cervello funzionante, e mai e poi mai scritti da nessuna parte.
Ciò nonostante, riceviamo orde di utenti che chiedono come aggirare 35 anni di sicurezza Unix.
Continua spiegando come puoi impostare il tuo shadow(5)
correttamente la password e mostra GNU-mi-interessa-solo-della-sicurezza-se-non-mi-fa-pensare-troppo -modo di abusare di passwd(1)
.
Infine, se hai intenzione di utilizzare la stupida estensione GNU passwd(1) --stdin
, non passare la password inserendola nella riga di comando.
echo $mypassword | passwd --stdin # Eternal Sin.
echo "$mypassword" | passwd --stdin # Eternal Sin, but at least you remembered to quote your PE.
passwd --stdin <<< "$mypassword" # A little less insecure, still pretty insecure, though.
passwd --stdin < "passwordfile" # With a password file that was created with a secure `umask(1)`, a little bit secure.
L'ultimo è il meglio che puoi fare con GNU passwd
. Anche se ancora non lo consiglierei.
Mettere la password sulla riga di comando significa che chiunque abbia anche il minimo accenno di accesso alla scatola può monitorare ps
o simili e rubare la password. Anche se pensi che la tua scatola sia al sicuro; è qualcosa che dovresti davvero prendi l'abitudine di evitare a tutti i costi (sì, anche il costo di fare un po' più di fatica per portare a termine il lavoro).
da "man 1 passwd
":
--stdin
This option is used to indicate that passwd should read the new
password from standard input, which can be a pipe.
Quindi nel tuo caso
adduser "$1"
echo "$2" | passwd "$1" --stdin
[Aggiorna ] alcuni problemi sono stati sollevati nei commenti:
Il tuo passwd
il comando potrebbe non avere un --stdin
opzione:usa chpasswd
utility invece, come suggerito da ashawley.
Se usi una shell diversa da bash, "echo" potrebbe non essere un comando integrato e la shell chiamerà /bin/echo
. Questo non è sicuro perché la password verrà visualizzata nella tabella dei processi e può essere vista con strumenti come ps
.
In questo caso, dovresti usare un altro linguaggio di scripting. Ecco un esempio in Perl:
#!/usr/bin/perl -w
open my $pipe, '|chpasswd' or die "can't open pipe: $!";
print {$pipe} "$username:$password";
close $pipe
Al giorno d'oggi, puoi usare questo comando:
echo "user:pass" | chpasswd