La única solución funciona en Ubuntu 12.04:
echo -e "new_password\nnew_password" | (passwd user)
Pero la segunda opción solo funciona cuando cambio de:
echo "password:name" | chpasswd
Para:
echo "user:password" | chpasswd
Ver explicaciones en la publicación original:Cambio de contraseña a través de un script
Lee las sabias palabras de:
- http://miwiki.wooledge.org/BashFAQ/078
Cito:
Nada de lo que puedas hacer en bash puede funcionar. passwd(1) no lee desde la entrada estándar. Esto es intencional. Es para tu protección. Las contraseñas nunca fueron pensadas para ser puestas en programas o generadas por programas. Estaban destinados a ser ingresados solo por los dedos de un ser humano real, con un cerebro funcional, y nunca, nunca escritos en ningún lado.
No obstante, tenemos hordas de usuarios que preguntan cómo pueden eludir los 35 años de seguridad de Unix.
Continúa explicando cómo puede configurar su shadow(5)
contraseña correctamente y le muestra el GNU-Solo-me-importa-la-seguridad-si-no-me-hace-pensar-demasiado -manera de abusar de passwd(1)
.
Por último, si VAS a usar la tonta extensión GNU passwd(1) --stdin
, no pasar la contraseña poniéndola en la línea de 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.
Lo último es lo mejor que puedes hacer con GNU passwd
. Aunque todavía no lo recomendaría.
Poner la contraseña en la línea de comando significa que cualquier persona con la más remota pista de acceso a la caja puede estar monitoreando ps
o tal y robar la contraseña. Incluso si cree que su caja es segura; es algo que deberías realmente adquiera el hábito de evitar a toda costa (sí, incluso el costo de hacer un poco más de problemas para hacer el trabajo).
de "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.
Así que en tu caso
adduser "$1"
echo "$2" | passwd "$1" --stdin
[Actualizar ] se mencionaron algunas cuestiones en los comentarios:
Tu passwd
el comando puede no tener un --stdin
opción:usar el chpasswd
utilidad en su lugar, como lo sugiere ashawley.
Si usa un shell que no sea bash, es posible que "echo" no sea un comando incorporado y el shell llamará a /bin/echo
. Esto no es seguro porque la contraseña aparecerá en la tabla de procesos y se puede ver con herramientas como ps
.
En este caso, debe utilizar otro lenguaje de secuencias de comandos. Aquí hay un ejemplo en Perl:
#!/usr/bin/perl -w
open my $pipe, '|chpasswd' or die "can't open pipe: $!";
print {$pipe} "$username:$password";
close $pipe
Hoy en día, puedes usar este comando:
echo "user:pass" | chpasswd