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
à 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
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
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).
Aujourd'hui:
echo "user:pass" | chpasswd
Vous pouvez utiliser chpasswd
echo $1:$2 | chpasswd
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
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
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
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).
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.
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