J'essaie de définir en masse quelques mots de passe de compte d'utilisateur à l'aide chpasswd
. Les mots de passe doivent être générés de manière aléatoire et imprimés sur stdout
(j'ai besoin de les écrire ou de les mettre dans un magasin de mots de passe), et également passés dans chpasswd
.
Naïvement, je ferais ça comme ça
{
echo student1:$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo '')
echo student2:$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo '')
} | tee >(chpasswd)
Cependant, je m'inquiète de passer le nouveau mot de passe comme argument de ligne de commande echo
, car les arguments sont généralement visibles par les autres utilisateurs de ps -aux
(bien que je n'ai jamais vu de echo
ligne apparaître ps
).
Existe-t-il une autre façon d'ajouter une valeur à mon mot de passe retourné, puis de la transmettre chpasswd
?
echo
est un shell intégré. Cela n'apparaîtrait pas dans le tableau des processus.Réponses:
Votre code doit être sûr car il
echo
n'apparaîtra pas dans la table de processus car il s'agit d'un shell intégré.Voici une solution alternative:
Cela crée les noms et mots de passe de vos élèves
n
, sans passer de mot de passe sur aucune ligne de commande d'une commande.L'
paste
utilitaire colle plusieurs fichiers sous forme de colonnes et insère un délimiteur entre eux. Ici, nous utilisons:
comme délimiteur et lui donnons deux "fichiers" (substitutions de processus). Le premier contient la sortie d'uneseq
commande qui crée 20 noms d'utilisateur d'étudiant, et le second contient la sortie d'un pipeline qui crée 20 chaînes aléatoires de longueur 13.Si vous avez un fichier avec des noms d'utilisateur déjà généré:
Ceux-ci enregistreront les mots de passe et les noms d'utilisateur dans le fichier
secret.txt
au lieu d'afficher les mots de passe générés dans le terminal.la source
echo
ouprintf
, cependant, le code est un peu difficile à déchiffrerecho
Cependant, vous ne devriez pas vous fier à être un shell intégré. Sur la plupart des obus, c'est le cas, mais il n'y a absolument aucune exigence.tee secret.txt > >(chpasswd)
ettee secret.txt | chpasswd
? Ce dernier semble beaucoup plus courant, donc je me demande pourquoi vous avez choisi d'utiliser la substitution de processus au lieu d'un tuyau ordinairetee
). Maintenant que vous l'avez souligné, je pense que je vais vraiment le changer (ça a l'air mieux). Merci.echo
est très probablement intégré au shell, il n'apparaîtra donc pasps
comme un processus séparé.Mais vous n'avez pas besoin d'utiliser la substitution de commandes, vous pouvez simplement avoir la sortie du pipeline directement vers
chpasswd
:Si vous souhaitez modifier plusieurs mots de passe en une seule fois
chpasswd
, il devrait être facile de répéter les parties essentielles. Ou faites-en une fonction:En passant: cela
head /dev/urandom
semble un peu étrange car ilurandom
n'est pas orienté ligne. Il pourrait y lire des quantités excessives d'octets, ce qui affectera la notion du noyau d'entropie disponible, ce qui pourrait entraîner un/dev/random
blocage. Il pourrait être plus propre de simplement lire une quantité fixe de données et d'utiliser quelque chose commebase64
pour convertir les octets aléatoires en caractères imprimables (au lieu de simplement jeter environ 3/4 des octets que vous obtenez).Quelque chose comme ça vous donnerait environ. 16 caractères et chiffres:
(soit 16 moins la quantité de
+
et/
caractères dans la sortiebase64
. La chance soit est 1/32 par caractère, donc si je suis mon combinatoires droite, qui donne environ 99% de chances de laisser au moins 14 caractères, et 99,99% de chances de quitter au moins 12.)la source
printf
solution ne fait pas ce que fait mon code d'origine: renvoyer plusieurs lignes pour plusieurs noms d'utilisateur, mais j'apprécie vos remarques surhead urandom
head -c 10 | base64
pipeline, ou celui de Nils avechead | tr
? 10 "lignes" d'octets aléatoires sont très probablement des centaines d'octets (étant donné que seulement 1 sur 256 serait des sauts de ligne), bien qu'en théorie cela puisse être exactement 10 octets, mais les chances de cela sont complètement négligeables. De même lors de l'utilisationbase64
, si les octets aléatoires sont justes\xff
, alors la base64 ne sera qu'une chaîne de barres obliques, mais c'est aussi peu probable. Si vous vous souciez, vous pouvez lire plus de 10 octets, réduire les chances de cela, puis réduire la longueur de la sortie résultante./dev/urandom
, mais le risque n'est pas de 0%.