Jak mohu přinutit GPG přijímat vstup ze standardního vstupu namísto pokusu o otevření souboru?

hlasů
3

Snažím se začlenit GPG clear podpisu textu v řetězci v PHP skriptu. I mohou způsobit GPG šifrování textu v řetězci, jako je tento:

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

a to funguje perfektně, s šifrované textové posílá na $ šifrované proměnné. To dokazuje GNUPGHOME a GNUPG jsou správně nastaveny.

Nicméně, když se snažím, aby došlo ke zřetelné podepsané zprávy stejným způsobem s tím:

$text = googar;

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

Já jsem se vrátil tuto chybu:

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

Tato chyba je vrácena s nebo bez apostrofy kolem $ textové proměnné.

Jak mohu vynutit GPG nebo shell_exec k léčbě $ text jako potrubí namísto toho hledá soubor?

Musím echo přístupové heslo tímto způsobem (já vím, jeho ‚strašně nejistá‘, protože GPG nemá žádný způsob, jak předat do přístupového hesla jako proměnná na příkazovém řádku.

Položena 08/08/2011 v 12:43
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
5

Dalo by se použít proc_open a vytvořit samostatný popisovač souboru pro zadání hesla:

$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";
}
Odpovězeno 08/08/2011 v 14:35
zdroj uživatelem

hlasů
2

Dalo by se použít substituci proces:

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

To umožní, aby gpg si myslí, že je čtení dat ze souboru, ale soubor bude dočasný pojmenovaný kanál, který vstup bude printf '$text'.

Odpovězeno 08/08/2011 v 14:20
zdroj uživatelem

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