Pourquoi les tuyaux échouent-ils avec GPG?

2

Je cherche à canaliser les mots de passe dans gpg pour le chiffrement symétrique, mais cela se passe comme si je n'avais rien à faire, et me demande toujours le mot de passe et le ressaisi.

Voici ce que j'essaye (avec 'enter' comme mot de passe):

(echo 'enter'; echo 'enter') | gpg -c test.py

Pourquoi ça ne marche pas?

Je sais déjà que vous pouvez utiliser --batch --yes --passphrase='enter', mais cela affichera le mot de passe dans la tâche dans le gestionnaire de tâches (et semble donc moins sécurisé - dites-moi si je me trompe).

EDIT: Je viens de me rendre compte que l'écho serait probablement toujours affiché dans le gestionnaire de tâches (également séparément de la commande gpg). Donc, pour contourner cela, je pourrais enregistrer le mot de passe dans un fichier temporaire et utiliser cat myPasswordFile au lieu de echo myPassword. Ainsi, ils devraient obtenir le mot de passe en temps réel à partir du fichier temporaire (tant qu'il existe) au lieu de simplement enregistrer toutes les tâches exécutées et obtenir le mot de passe à leur guise.

Shule
la source

Réponses:

3

Vous pouvez utiliser --passphrase-fd 0 dire à gpg de lire le mot de passe de stdin. Cela devrait bien s'entendre avec les pipes. Ne l'envoie pas deux fois. cela n'est nécessaire que pour la détection des fautes de frappe lorsque vous le faites de manière interactive.

Normalement, gpg lit à partir du terminal afin que vous puissiez rediriger les entrées et les sorties tout en ayant la possibilité de saisir une phrase secrète.

Dans une session de connexion normale, votre shell est connecté au terminal par 3 descripteurs de fichier: stdin, stdout et stderr. Les canaux et les opérateurs de redirection changent là où ces descripteurs de fichier pointent.

Si vous exécutez une commande sans opérateur de redirection, tous les descripteurs de fichier sont hérités du shell. Quand il lit à partir de stdin, il lit à partir du tty.

Si vous exécutez la même commande avec un < opérateur de redirection, son stdin est connecté au fichier dont le nom apparaît après le <. Si vous mettez une commande sur le côté droit d'un | opérateur, son stdin est connecté à un descripteur de fichier pipe (dont l'extrémité opposée est connectée à la sortie standard de la commande située à gauche de la commande). |.)

C'est ce que vous saviez probablement déjà. Ce que vous ne saviez pas, c’est qu’outre les descripteurs de fichiers, il existe une autre chose qui relie les terminaux aux processus terminal de contrôle . Votre processus shell a un terminal de contrôle et il est hérité par tous les processus enfants, y compris dans ce cas votre gpg.

Lorsqu'un programme souhaite obtenir une saisie au clavier de l'utilisateur alors que stdin n'est pas un terminal, il peut accéder à son terminal de contrôle en ouvrant le fichier spécial. /dev/tty.

Un type de programme qui dépend fortement de cette fonctionnalité est un pager (par exemple. more, less ). Si tu cours somecommand | less, quoi less veut lire une entrée du tuyau sur stdin, afficher le premier écran, puis lire sur le clavier pour attendre que vous appuyiez sur une touche pour lui indiquer quoi faire. stdin ne peut pas être à la fois le tuyau et le clavier, donc less ouvre /dev/tty.

Le terminal de contrôle d’un processus est répertorié dans le TTY colonne par ps.

Wumpus Q. Wumbley
la source
Ça marche! :) par exemple. echo enter|gpg --passphrase-fd 0 -c myFile.txt. Cela me dit ensuite, juste pour mémoire: Reading passphrase from file descriptor 0. Donc, vous avez résolu mon problème (merci beaucoup), mais je suis toujours curieux de savoir de quelle entrée il lit si ce n’est l’entrée standard (et pourquoi).
Shule
1
vous pouvez aussi faire GPG = $ (tty) avant que cela affecte le même résultat
linuxdev2013