Mot de passe de chiffrement symésortingque GPG change

J’essaie de trouver un moyen de changer le mot de passe d’un fichier chiffré symésortingquement par GPG sans utiliser de fichier temporaire ou de variable shell. Je sais que je pourrais le faire dans une fonction shell avec une variable mais je voudrais le faire sur la ligne de commande si possible.

Je pense que cela devrait être possible car GPG va crypter les stream entrants avec gpg --symmesortingc -o example.gpg et parce que GPG enverra la sortie décryptée à STDOUT avec gpg --decrypt .

Mais cela ne fonctionne pas correctement:

 gpg --decrypt example.gpg | gpg --symmesortingc -o new.gpg 

Je pense que ma compréhension de l’ordre des opérations et de la redirection du shell est fausse. Surtout parce que la sortie du shell a plus d’une Enter passphrase: invite à la fois.

Voici la réponse interactive initiale après la saisie des commandes de canalisation:

 localhost ~% gpg --decrypt example.gpg | gpg --symmesortingc -o example.gpg gpg: CAST5 encrypted data Enter passphrase: Enter passphrase 

Après cela, je reçois diverses invites de mot de passe … parfois, on me demande le mot de passe de décryptage, puis je peux saisir le nouveau mot de passe en texte brut visible, puis la nouvelle confirmation de mot de passe masquée. Parfois, je reçois le nouveau dialog de mot de passe avant qu’on me demande le mot de passe de décryptage.

Je pense qu’il y a une condition de course.

Aucun conseil?

Solution:

Vous devez indiquer de manière non interactive à la première commande gpg quelle est la phrase secrète de déchiffrement.

  • Avec gpg2 (la plupart des dissortingbutions Linux modernes livrées avec cela), cela pourrait ressembler à ceci:

     gpg --decrypt --batch --passphrase 'original passwd' example.gpg | gpg --symmesortingc -o new_example.gpg 
  • Avec gpg1, vous utiliseriez --no-use-agent au lieu de --batch , par exemple:

     gpg -d --no-use-agent --passphrase 'original passwd' example.gpg | gpg -co new_example.gpg 

Remarque: en fonction de votre version de gpg et de sa configuration, vous devrez peut-être également spécifier la phrase secrète de la même manière pour la deuxième commande gpg.

Cause première:

Lorsque vous créez une ligne de commande avec des tuyaux, votre shell lance toutes les commandes en même temps après avoir configuré les canaux pour se connecter (pour permettre à stdout de chaque commande d’être envoyé à stdin du suivant).

Avertissements supplémentaires:

  1. N’écrivez pas dans le même fichier que celui que vous lisez. Cela ne fonctionnera presque jamais comme tu veux.

  2. Sur un système multi-utilisateurs, il est --passphrase utiliser l’option --passphrase de gpg, car elle permet à toute personne du système de contrôler la phrase secrète (tout le monde peut exécuter une commande ps et voir la phrase secrète pendant l’exécution de la commande gpg ). De plus, la phrase secrète est enregistrée dans votre historique de shell. Oui Si cela pose problème, utilisez --passphrase-fd ou --passphrase-file .