2011-08-08 9 views
3

PHP 스크립트의 문자열에 GPG의 텍스트 서명을 통합하려고합니다.GPG가 파일을 열지 않고 STDIN의 입력을 받아들이도록하려면 어떻게해야합니까?

$encrypted = shell_exec("echo '$text' | gpg -e -a -r [email protected] --trust-model always"); 

을하고 암호화 된 텍스트가 $ 암호화 된 변수에 전송되는으로, 완벽하게 작동 : 나는 GPG이 같은 문자열의 텍스트를 암호화하는 원인이 될 수 있습니다. 이것은 GNUPGHOME과 GNUPG가 올바르게 설정되었음을 증명합니다. 그러나

, 나는이와 같은 방법으로 일반 텍스트로 서명 된 메시지를 생성 할 때 :이 오류를 반환하고

$text = "googar"; 

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

:

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

이 오류와 함께 또는없이 반환 $ text 변수 주위의 작은 따옴표.

GPG 또는 shell_exec이 $ text를 파일을 찾는 대신 파이프로 처리하도록하려면 어떻게해야합니까?

나는 GPG 명령 행에서 변수로 암호를 전달 할 수있는 방법이 없기 때문에, (내가 아는이 방법으로는 '끔찍하게 불안을'암호를 에코 할 필요가

답변

5

당신은 proc_open를 사용할 수와에 대해 별도의 파일 기술자를 만들 내 비밀번호 :

$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"; 
} 
+0

고맙습니다. 문제가 해결되었습니다. 내가 코드에 빠졌고, 그냥 작동합니다. 새로운 것을 배우기 위해 그 부분을 공부할 것입니다. 다시 한번 감사드립니다! – Axinar

2

당신은 공정 대체를 사용할 수 있습니다. :

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

이 GPG는이 파일에서 데이터를 읽고 생각하게되지만, 파일은 입력 printf '$text' 될 것입니다 임시 명명 된 파이프 될 것입니다.

+0

답변 해 주셔서 감사합니다. 이제 오류는 반환되지 않지만 GPG 서명 된 출력은 표시되지 않습니다. – Axinar

+0

stdout 및 stderr이/dev/null에 파이프되어 있기 때문에 사실 출력이 없습니다. 끝에서'2> & 1/1/dev/null'없이 시도해보십시오. 결과가 정상이면 대답을 업데이트 할 것입니다. (나 자신이 테스트 케이스를 작성하기에는 너무 게으른 편입니다.) – jfg956