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
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
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
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).
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).
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
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
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.
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
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.
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