Je dois modifier manuellement /etc/shadow
pour changer le mot de passe root à l'intérieur d'une image de machine virtuelle.
Existe-t-il un outil en ligne de commande qui prend un mot de passe et génère un /etc/shadow
hachage de mot de passe compatible sur sortie standard?
Vous pouvez utiliser les commandes suivantes pour les mêmes:
openssl passwd -6 -salt xyz yourpass
Remarque: en passant -1
générera un mot de passe MD5, -5
un SHA256 et -6
SHA512 (recommandé)
mkpasswd --method=SHA-512 --stdin
Les méthodes acceptent md5
, sha-256
et sha-512
Comme l'a suggéré @tink, nous pouvons mettre à jour le mot de passe en utilisant chpasswd
en utilisant:
echo "username:password" | chpasswd
Ou vous pouvez utiliser un mot de passe chiffré avec chpasswd
. Générez-le d'abord en utilisant ceci:
Perl -e 'print crypt("YourPasswd", "salt", "sha512"),"\n"'
Ensuite, vous pouvez utiliser le mot de passe généré pour mettre à jour:
echo "username:encryptedPassWd" | chpasswd -e
Ce mot de passe crypté que nous pouvons utiliser pour créer un nouvel utilisateur avec mot de passe, par exemple:
useradd -p 'encryptedPassWd' username
Sur Ubuntu 12.04, il y a mkpasswd (à partir du paquet whois): frontal surpuissant à crypt (3)
mkpasswd -m sha-512 -S saltsalt -s <<< YourPass
Où:
-m
= Calculez le mot de passe à l'aide de la méthode TYPE. Si TYPE est une aide, les méthodes disponibles sont imprimées.-S
= sel utilisé.Par exemple.
$ mkpasswd -m help
-s = Read password from stdin
Cette solution présente les avantages suivants:
Re-invite le mot de passe pour éviter les erreurs.
$ python3 -c "from getpass import getpass; from crypt import *; \
p=getpass(); print('\n'+crypt(p, METHOD_SHA512)) \
if p==getpass('Please repeat: ') else print('\nFailed repeating.')"
Aucune des méthodes actuelles n'est acceptable pour moi - Soit ils passent le mot de passe sur la ligne de commande (qui finit dans l'historique de mon Shell), nécessitent l'installation d'utilitaires supplémentaires (python3
, makepasswd
), utilisez des sels codés en dur ou utilisez d'anciennes techniques de hachage.
Cette méthode générerait des hachages SHA-512 après avoir demandé le mot de passe et utiliserait un sel aléatoire.
Une méthode utilisant Python 2 sans bibliothèques non standard:
python2 -c 'import crypt, getpass,os,base64; print crypt.crypt(getpass.getpass(), "$6$"+base64.b64encode(os.urandom(16))+"$")'
Pour le faire sans invite: (Cela laissera votre mot de passe dans l'historique des commandes)
python2 -c 'import crypt, os,base64; print crypt.crypt("MyPassword", "$6$"+base64.b64encode(os.urandom(16))+"$")'
Pour ceux sans systèmes basés sur Debian. Python3 fonctionne aussi bien.
python3 -c 'import crypt; print(crypt.crypt("test"))'
REMARQUE: La chaîne "test" est le mot de passe que nous générons sous forme de chaîne cryptée.
Les openssl
et chpasswd -e
la paire n'a pas fonctionné dans mon cas dans RHEL6. Combiner openssl passwd
et usermod -p
la commande a fait le travail.
Générez la valeur de hachage du mot de passe avec la valeur de sel:
$ openssl passwd -1 -salt 5RPVAd clear-text-passwd43
$1$5RPVAd$vgsoSANybLDepv2ETcUH7.
Ensuite, copiez la chaîne chiffrée dans usermod. Assurez-vous de l'envelopper avec des guillemets simples.
$ usermod -p '$1$5RPVAd$vgsoSANybLDepv2ETcUH7.' root
Vérifiez-le dans le fichier shadow.
$ grep root /etc/shadow
root:$1$5RPVAd$vgsoSANybLDepv2ETcUH7.:17774:0:99999:7:::
Encore une autre méthode pour générer des mots de passe, utilise l'outil openssl
.
Générer des mots de passe MD5
openssl passwd -1 -salt SaltSalt SecretPassword
# output: $1$SaltSalt$FSYmvnuDuSP883uWgYBXW/
Générer DES mots de passe
openssl passwd -crypt -salt XR SuprScrt
# output: XR1dOp2EVMph2
En développant un peu les critiques de u150825 et de Gert van den Berg, je me suis retrouvé à avoir besoin de quelque chose de relativement flexible pour différentes situations avec différents systèmes d'automatisation. J'ai décidé d'ajouter à ma propre petite bibliothèque de scripts utiles et d'écrire ceci. Il utilise uniquement des bibliothèques natives de python 2.7+, et fonctionne également sur python3.
Vous pouvez le récupérer ici si vous le souhaitez. Il est tout aussi facile de le déposer dans votre environnement si vous avez besoin de l'utiliser beaucoup, hébergé http ou autre, et vous pouvez l'exécuter sur n'importe quelle plate-forme en utilisant le interpréteur par défaut python vous 'ai mis à votre disposition est, en comptant assez fiable sur son fonctionnement.
Par défaut, il invite à utiliser getpass avec des invites sur stderr (permettant une capture facile de stdout), mais si vous lui redirigez une chaîne, elle sera simplement récupérée à partir de stdin. Selon la façon dont vous vous y prenez, il se peut que cela n'apparaisse pas non plus dans l'historique des commandes, alors sachez simplement avec quoi vous travaillez. J'aime avoir un outil flexible qui se comportera de la manière attendue, plutôt que de devoir compter sur des packages ou python une seule ligne pour gagner 10 façons différentes).