3
votes

pipe value à sed et l'utiliser dans la chaîne de remplacement

J'essaie de générer un utilisateur et un mot de passe par programme, puis je hache le mot de passe et je le stocke dans le fichier de configuration grub

J'ai actuellement ceci

# add a superuser account and password for the bootloader
## generate a secure password
pw=$(openssl rand -base64 32)

## create the new user for the bootloader and set the password as the secure password
useradd grub2superuseraccount
echo $pw | passwd grub2superuseraccount --stdin

## store the password to a TEMP file (needed to pass the password to grub2_mkpassword-pbkdf command, it will be deleted after)
cat << END >> ~/pfile
$pw
$pw
END

## generate the password hash and store it in the bootloader config file
cat ~/pfile | grub2-mkpasswd-pbkdf2 | sed -i "/password_pbkdf2/a password_pbkdf2 $THEVALUEOFTHEOUTPUTFROMTHEPIPE"

## delete the file with the password
rm ~/pfile 

Comment puis-je Je passe la sortie du mot de passe haché de 'grub2-mkpasswd-pbkdf2' à la commande sed?

OU

S'il y a une autre façon de faire cela plus élégamment, comment pourrais-je procéder faire ça?


3 commentaires

Vous pouvez probablement utiliser la substitution de processus pour atteindre votre objectif.


J'utilise cet exemple qui le permet apparemment github.com/ryran /burg2-mkpasswd-pbkdf2/blob/master/README.md


Si votre script contient de toute façon la variable en mémoire, faire en sorte que le script écrive le mot de passe dans un fichier n'améliore pas vraiment la sécurité.


3 Réponses :


1
votes

Vous pouvez utiliser GNU / Bash read pour répondre à vos besoins, par exemple:

cat ~/pfile | grub2-mkpasswd-pbkdf2 | (read THEVALUEOFTHEOUTPUTFROMTHEPIPE && sed -i "/password_pbkdf2/a password_pbkdf2 $THEVALUEOFTHEOUTPUTFROMTHEPIPE")


0 commentaires

3
votes

Voici un refactoring qui évite également le fichier temporaire embêtant.

printf '%s\n' "$pw" "$pw" |
grub2-mkpasswd-pbkdf2 |
xargs -i sed -i "/password_pbkdf2/a password_pbkdf2 {}" conffile

Votre question n'indique pas le nom de conffile donc évidemment le remplacer par le nom de le fichier sur lequel vous voulez réellement exécuter sed -i .

Si la sortie de grub2-mkpasswd-pdkdf2 peut contenir des retours à la ligne ou d'autres caractères problématiques, peut-être ajouter quelques échappements à la variable.

Si vous avez vraiment besoin d'un tube à utiliser, peut-être regardez dans xargs.

pw=$(openssl rand -base64 32)
useradd grub2superuseraccount
# Notice proper quoting
echo "$pw" | passwd grub2superuseraccount --stdin
# Collect output into a variable
grubpw=$(printf '%s\n' "$pw" "$pw" | grub2-mkpasswd-pbkdf2)
# Use the variable in sed -i
sed -i "/password_pbkdf2/a password_pbkdf2 $grubpw" conffile


3 commentaires

Cela a l'air beaucoup plus élégant en effet, je vais essayer cela! Merci pour les réponses rapides à vous tous


J'ai mis à jour la question avec votre contribution si vous êtes intéressé, merci encore!


Votre question doit rester strictement une question. Si vous souhaitez ajouter une réponse de votre choix, vous pouvez le faire. (Vous pouvez récupérer vos modifications à partir de l ' historique des révisions. )



0
votes

Comment puis-je transmettre la sortie du mot de passe haché de 'grub2-mkpasswd-pbkdf2' à la commande sed?

Via la substitution de commande, aucun tube nécessaire:

sed -i "/password_pbkdf2/c password_pbkdf2 $(grub2-mkpasswd-pbkdf2 < ~/pfile)" your_grub.conf

Notez que j'ai légèrement modifié votre commande sed , en utilisant c code > pour c accrocher la ligne entière à ce qui suit la commande, au lieu de a qui a ajoute une ligne entièrement nouvelle.


1 commentaires

@Inian Désolé, je parlais de substitution commande . Merci pour la capture.