web-dev-qa-db-fra.com

Utilisation de la commande passwd à partir d'un script Shell

J'écris un script Shell pour ajouter automatiquement un nouvel utilisateur et mettre à jour son mot de passe. Je ne sais pas comment obtenir le mot de passe lu par le script Shell au lieu de me demander de manière interactive le nouveau mot de passe. Mon code est ci-dessous.

adduser $ 1 
 passwd $ 1 
 $ 2 
 $ 2
54
Jared

à partir 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 ton cas

adduser "$1"
echo "$2" | passwd "$1" --stdin

[Update] quelques points ont été soulevés dans les commentaires:

Votre commande passwd peut ne pas avoir d’option --stdin: utilisez plutôt l’utilitaire chpasswd Comme suggéré par ashawley .

Si vous utilisez un shell autre que bash, "echo" peut ne pas être une commande intégrée, Et le shell appellera /bin/echo. Ceci est peu sûr 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
79
8jean

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 l'article original: Changer le mot de passe via un script

46
Fernando Kosh

Lire les mots sages de:

Je cite:

Rien de ce que vous pouvez faire à bash ne peut éventuellement 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é conçus pour être intégrés à des programmes ou générés par des programmes. Ils étaient destinés à n'être saisis que par les doigts d'un être humain réel, avec un cerveau fonctionnel, et jamais, jamais écrits, nulle part.

Néanmoins, de nombreux utilisateurs demandent comment ils peuvent contourner les 35 années de sécurité Unix.

Il explique ensuite comment vous pouvez définir votre mot de passe shadow(5) correctement et vous montre le nom GNU - . Je ne me soucie que de la sécurité si elle ne le fait pas. -me-pense-trop-beaucoup - moyen d'abuser de passwd(1).

Enfin, si vous allez utiliser l'extension idiote GNU passwd (1) --stdin, ne passez pas le mot de passe 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 ce que vous pouvez faire de mieux avec GNU passwd. Bien que je ne le recommande toujours pas.

Mettre le mot de passe sur la ligne de commande signifie que toute personne ayant le moindre soupçon d'accès à la boîte peut surveiller ps ou autre et voler le mot de passe. Même si vous pensez que votre boîte est en sécurité; c'est quelque chose que vous devriez réellement prendre pour habitude d'éviter à tout prix (oui, même le coût d'un peu plus de difficultés pour faire le travail).

26
lhunath

Aujourd'hui: 

echo "user:pass" | chpasswd

22
BlackNoxis

Vous pouvez utiliser chpasswd

echo $1:$2 | chpasswd

1
bsmoo

Pour ceux qui ont besoin de "s'exécuter en tant que root" via un script se connectant à un compte d'utilisateur dans le fichier sudoers, j'ai trouvé un piratage horrible, qui est sans doute très peu sécurisé:

sshpass -p 'userpass' ssh -T -p port user@server << EOSSH
Sudo -S su - << RROOT
userpass
echo ""
echo "*** Got Root ***"
echo ""
#[root commands go here]
useradd -m newuser
echo "newuser:newpass" | chpasswd
RROOT
EOSSH
1
Raydude

Je suis tombé sur le même problème et pour une raison quelconque, l'option "--stdin" n'était pas disponible sur la version de passwd que j'utilisais (livrée sur Ubuntu 14.04).

Si l'un de vous expérimente la même chose, vous pouvez le contourner comme je l'ai fait: en utilisant la commande chpasswd comme ceci:

echo "<user>:<password>" | chpasswd

0
Mariano Anaya

Parfois, il est utile de définir un mot de passe que personne ne connaît. Cela semble fonctionner:

tr -dc A-Za-z0-9 < /dev/urandom | head -c44 | passwd --stdin $user
0
user3811862

Avez-vous examiné l'option -p de adduser (AFAIK n'est qu'un autre nom pour useradd)? Vous voudrez peut-être aussi regarder l'option -P de luseradd qui prend un mot de passe en texte brut, mais je ne sais pas si luseradd est une commande standard (cela peut faire partie de SE Linux ou peut-être simplement une bizarrerie de Fedora).

0
rmeador

C'est la réponse définitive pour un administrateur de noeud teradata.

Accédez à votre fichier /etc/hosts et créez une liste d'adresses IP ou de noms de nœuds dans un fichier texte.

SMP007-1
SMP007-2
SMP007-3

Placez le script suivant dans un fichier.

#set a password across all nodes
printf "User ID: "
read MYUSERID
printf "New Password: "
read MYPASS

while read -r i; do
    echo changing password on "$i"
    ssh root@"$i" Sudo echo "$MYUSERID":"$MYPASS" | chpasswd
    echo password changed on "$i"
done< /usr/bin/setpwd.srvrs

Ok, je sais que j'ai enfreint une règle de sécurité cardinale avec ssh et root Mais je vous laisserai les responsables de la sécurité s'en occuper.

Maintenant, mettez ceci dans votre sous-répertoire /usr/bin avec votre fichier de configuration setpwd.srvrs.

Lorsque vous exécutez la commande, elle vous invite une fois à entrer l'ID utilisateur Puis une fois à saisir le mot de passe. Ensuite, le script parcourt tous les nœuds dans le fichier setpwd.srvrs et effectue un SSH sans mot de passe sur chaque nœud, puis définit le mot de passe sans aucune interaction de l'utilisateur ni validation secondaire du mot de passe. 

0
JohnS

Testé ceci sur une image CentOS VMWare que je garde pour ce genre de chose. Notez que vous voulez probablement éviter de mettre les mots de passe en tant qu'arguments de ligne de commande, car n'importe qui sur la machine entière peut les lire avec "ps -ef".

Cela dit, cela fonctionnera:

user="$1"
password="$2"
adduser $user
echo $password | passwd --stdin $user
0
Don Werve