La seule solution fonctionne sur Ubuntu 12.04 :
echo -e "new_password\nnew_password" | (passwd user)
Mais la deuxième option ne fonctionne que lorsque je change de :
echo "password:name" | chpasswd
À :
echo "user:password" | chpasswd
Voir les explications dans le post d'origine :Changer le mot de passe via un script
Lisez les sages paroles de :
- http://mywiki.wooledge.org/BashFAQ/078
Je cite :
Rien de ce que vous pouvez faire dans bash ne peut fonctionner. passwd(1) ne lit pas à partir de l'entrée standard. C'est intentionnel. C'est pour votre protection. Les mots de passe n'ont jamais été destinés à être placés dans des programmes ou générés par des programmes. Ils étaient destinés à être entrés uniquement par les doigts d'un être humain réel, avec un cerveau fonctionnel, et jamais, jamais écrits nulle part.
Néanmoins, nous recevons des hordes d'utilisateurs demandant comment ils peuvent contourner 35 ans de sécurité Unix.
Il explique ensuite comment vous pouvez définir votre shadow(5)
mot de passe correctement, et vous montre le GNU-I-only-care-about-security-if-it-doesn't-make-me-think-too-much -façon d'abuser passwd(1)
.
Enfin, si vous allez utiliser l'extension stupide GNU passwd(1) --stdin
, ne pas passez le mot de passe en le mettant sur la ligne de commande.
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.
Le dernier est le mieux que vous puissiez faire avec GNU passwd
. Même si je ne le recommanderais toujours pas.
Mettre le mot de passe sur la ligne de commande signifie que n'importe qui avec le moindre indice d'accès à la boîte peut surveiller ps
ou tel et voler le mot de passe. Même si vous pensez que votre box est en sécurité; c'est quelque chose que vous devriez vraiment prenez l'habitude d'éviter à tout prix (oui, même le coût de faire un peu plus de mal à faire le travail).
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.
Donc dans votre cas
adduser "$1"
echo "$2" | passwd "$1" --stdin
[Mettre à jour ] quelques problèmes ont été soulevés dans les commentaires :
Votre passwd
la commande peut ne pas avoir de --stdin
option :utilisez le chpasswd
utilitaire à la place, comme suggéré par ashawley.
Si vous utilisez un shell autre que bash, "echo" n'est peut-être pas une commande intégrée et le shell appellera /bin/echo
. Ceci n'est pas sécurisé car le mot de passe apparaîtra dans la table de processus et peut être vu avec des outils comme ps
.
Dans ce cas, vous devez utiliser un autre langage de script. Voici un exemple en Perl :
#!/usr/bin/perl -w
open my $pipe, '|chpasswd' or die "can't open pipe: $!";
print {$pipe} "$username:$password";
close $pipe
De nos jours, vous pouvez utiliser cette commande :
echo "user:pass" | chpasswd