Comment puis-je forcer GPG à accepter l'entrée STDIN au lieu d'essayer d'ouvrir un fichier?

voix
3

Je suis en train d'incorporer GPG clair signature du texte dans une chaîne dans un script PHP. Je peux faire GPG pour crypter du texte dans une chaîne comme ceci:

$encrypted = shell_exec(echo '$text' | gpg -e -a -r foo@bar.com --trust-model always);

et qui fonctionne parfaitement, avec le texte crypté envoyé à la variable $ cryptée. Cela prouve GNUPGHOME et GnuPG sont mis en place correctement.

Cependant, lorsque je tente de produire un message clair-signé de la même manière avec ceci:

$text = googar;

$signature = exec(echo $passphrase | gpg -v --clearsign --no-tty --passphrase-fd 0 '$text' 2>&1 1> /dev/null, $output);

Je suis retourné cette erreur:

... string(51) gpg: can't open `googar': No such file or directory
[3]=>
string(46) gpg: googar: clearsign failed: file open error
}

Cette erreur est retournée avec ou sans les guillemets simples autour de la variable $ texte.

Comment puis-je forcer GPG ou shell_exec pour traiter $ texte comme un tuyau au lieu de la recherche d'un fichier?

Je dois faire écho à la phrase de cette façon (je sais, son « horriblement insécurité » parce que GPG n'a aucun moyen de passer d'une phrase comme une variable sur la ligne de commande.

Créé 08/08/2011 à 12:43
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
2

Vous pouvez utiliser la substitution de processus:

echo $passphrase | gpg -v --clearsign --no-tty --passphrase-fd 0 <(printf '$text') 2>&1 1> /dev/null
                                                                 ^^              ^

Cela fera GPG pense qu'il est en train de lire les données à partir d' un fichier, mais le fichier sera un tuyau temporaire nommé qui sera entrée printf '$text'.

Créé 08/08/2011 à 14:20
source utilisateur

voix
5

Vous pouvez utiliser proc_open et créer un descripteur de fichier séparé pour votre mot de passe:

$descriptorspec = array(
    0 => array("pipe", "r"),
    1 => array("pipe", "w"),
    2 => array("pipe", "w"),
    3 => array("pipe", "r"),
);

$pipes = false;
$process = proc_open("gpg -v --clearsign --no-tty --passphrase-fd 3", $descriptorspec, $pipes);

if(is_resource($process)) {
    fwrite($pipes[3], $passphrase);
    fclose($pipes[3]);

    fwrite($pipes[0], $text);
    fclose($pipes[0]);

    $output = stream_get_contents($pipes[1]);
    $stderr = stream_get_contents($pipes[2]);

    fclose($pipes[1]);
    fclose($pipes[2]);

    $retval = proc_close($process);

    echo "retval = $retval\n";
    echo "output= $output\n";
    echo "err= $stderr\n";
}
Créé 08/08/2011 à 14:35
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more