Utilisation de la commande passwd depuis 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 faire lire le script shell à passwd au lieu de me demander le nouveau mot de passe de façon interactive. Mon code est en dessous.

adduser 
passwd 

49
demandé sur codeforester 2009-04-03 21:34:53

12 réponses

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 ""
echo "" | passwd "" --stdin

[ mise à Jour ] quelques questions ont été soulevées dans les commentaires:

votre commande passwd peut ne pas avoir l'option --stdin : utilisez la commande chpasswd de l'utilitaire au lieu de cela, comme l'a suggéré ashawley .

si vous utilisez un shell autre que bash, "echo" pourrait ne pas être builtin commande, et le shell appellera /bin/echo . C'est non sécurisé parce que 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
76
répondu 8jean 2017-05-23 12:34:47

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 original: Changement de mot de passe via un script

44
répondu Fernando Kosh 2012-08-03 01:02:31

lire les mots sages de:

je cite:

rien de ce que vous pouvez faire à bash ne peut fonctionner. passwd (1) ne se lit pas à partir de l'entrée standard. Cela est intentionnel. C'est pour votre protection. Les mots de passe n'ont jamais été conçus pour être insérés dans des programmes, ou générés par des programmes. Ils ont été destiné à être saisi que par les doigts d'un être humain, avec une fonctionnelle du cerveau, et jamais, jamais écrit nulle part.

néanmoins, des hordes d'utilisateurs se demandent comment ils peuvent contourner 35 ans de sécurité Unix.

explique ensuite comment vous pouvez configurer correctement votre mot de passe shadow(5) , et vous montre le GNU - -Je-ne-pense-qu'à-la-sécurité-si-cela-ne-me-fait-penser-trop - - manière de abuser de passwd(1) .

enfin, si vous allez utiliser l'extension silly GNU passwd(1) --stdin , ne pas passer 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 le meilleur que vous pouvez faire avec GNU passwd . Bien que je ne le recommande pas.

mettre le mot de passe sur la ligne de commande signifie que n'importe qui, même avec le moindre soupçon d'accès à la boîte peut être surveiller ps ou tel et voler le mot de passe. Même si vous pensez que votre boîte est sûre; c'est quelque chose que vous devriez vraiment prendre l'habitude d'éviter à tout prix (oui, même le coût de faire un peu plus de difficulté à obtenir le travail fait).

26
répondu lhunath 2009-04-03 20:59:30

de nos jours:

echo "user:pass" | chpasswd

21
répondu BlackNoxis 2013-11-02 19:08:10

vous pouvez utiliser chpasswd

echo : | chpasswd

2
répondu bsmoo 2013-04-08 10:18:35

avez-vous regardé l'option -p de adduser (quel AFAIK est juste un autre nom pour useradd )? Vous pouvez aussi vouloir regarder l'option -P de luseradd qui prend un mot de passe en clair, mais je ne sais pas si luseradd est une commande standard (il peut faire partie de se Linux ou peut-être juste une bizarrerie de Fedora).

1
répondu rmeador 2009-04-03 17:43:33

a testé cela sur une image CentOS VMWare que je garde pour ce genre de chose. Notez que vous voulez probablement éviter de mettre des mots de passe comme argument de ligne de commande, parce que n'importe qui sur la machine entière peut les lire hors de 'ps-ef'.

Qui dit, cela va fonctionner:

user=""
password=""
adduser $user
echo $password | passwd --stdin $user
1
répondu Don Werve 2009-04-03 17:49:38

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 (envoyé sur un 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

1
répondu Mariano Anaya 2015-03-12 22:16:19

C'est la réponse définitive pour un noeud teradata admin

1: Allez dans votre fichier /etc/hosts et créez une liste de noms D'IP ou de noeuds dans un fichier texte

------------------fichier de configuration pour les serveurs de commencer ------------

SMP007-1

SMP007-2

SMP007-3

------ fin de fichier laisser ces commentaires de le fichier cfg---

maintenant le script

définir un mot de passe à travers tous les noeuds

printf "ID de l'Utilisateur:"

lire MYUSERID

printf "nouveau mot de passe: "

lire MYPASS

for i in ` cat/usr/bin / setpwd.srvrs `

do

echo changer le mot de passe sur $i

SSH root@ $ i sudo echo "$ MYUSERID": "$MYPASS" / chpasswd

echo mot de passe changé sur $i

fait à

OK je sais que j'ai enfreint une règle de sécurité avec SSH et root mais je vais vous laisser les gens de la sécurité s'en occuper

_________________________________

mettez ceci dans votre /usr/bin subdir avec votre setpwd.srvrs fichier de configuration

lorsque vous exécutez la commande il vous invite une fois pour L'Utilisateur ID

puis une fois le mot de passe. Puis le script traverse tous les noeuds

dans le setpwd.le fichier srvrs fait un SSH sans mot de passe à chaque noeud

puis définit le mot de passe sans aucune interaction utilisateur ou secondaire

validation du mot de passe. Maintenant, combien de fois avez-vous voulu faire ceci

mais ne savez pas comment faire? Avec grand besoin, vient grande innovation.



Pensez à quel point quelque chose comme ceci est utile à un administrateur avec des centaines

de serveurs.

1
répondu JohnS 2016-06-02 23:06:18

pour ceux qui ont besoin de "s'exécuter en tant que root" à distance à travers un script se connectant à un compte utilisateur dans le fichier sudoers, j'ai trouvé un horrible hack diabolique, qui est sans doute très peu sûr:

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
répondu Raydude 2017-05-04 21:39:51

vous pouvez utiliser le expect utilitaire pour conduire tous les programmes qui lisent à partir d'un ATS (par opposition à stdin, qui est ce que passwd fait). Expect est livré avec des exemples prêts à exécuter pour toutes sortes de problèmes interactifs, comme l'entrée passwd.

0
répondu Jens 2012-06-02 08:21:52

il est parfois 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
répondu user3811862 2014-07-07 09:33:43