Proces Java nemůže zachytit InputStream, OutputStream z gpg.exe

hlasů
3

Snažím se dešifrovat pomocí gpg.exe --passphrase-file my.passphrase --decrypt --output MTR241_20111124.htm MTR241_20111124.htm.gpg(bez --batch a --yes možnost). Jsem také poskytuje příkaz šifrování, jestli někdo zajímá jej použít pro testování gpg.exe --passphrase-file ..\BE\src\my.passphrase --symmetric --output MTR241_20111124.htm.gpg MTR241_20111124.htm.

Existují dva případy. Případ 1: MTR241_20111124.htm soubor neexistuje ve výstupním dir. Oba příkazového řádku a zachytil výstupní proud exec poskytuje stejný výsledek.

C:\Eclipse\workspace2\sync_inbox>gpg.exe  --passphrase-file ..\BE\src\my.passphrase --decrypt --output MTR241_20111124.htm MTR241_20111124.htm.gpg
Reading passphrase from file descriptor 3
gpg: CAST5 encrypted data
gpg: encrypted with 1 passphrase
gpg: WARNING: message was not integrity protected

Stejné messags dostane vytištěny java exec a příkazového řádku.

C:\Eclipse\workspace2\sync_inbox>gpg.exe  --passphrase-file ..\BE\src\my.passphrase --decrypt --output MTR241_20111124.htm MTR241_20111124.htm.gpg
inp>gpg.exe  --passphrase-file ..\BE\src\my.passphrase --decrypt --output MTR241_20111124.htm MTR241_20111124.htm.gpg
gpg.exe  --passphrase-file ..\BE\src\my.passphrase --decrypt --output MTR241_20111124.htm MTR241_20111124.htm.gpg
gpg: CAST5 encrypted data
gpg: encrypted with 1 passphrase
gpg: WARNING: message was not integrity protected

Doposud dost dobrý

Případ 2: Pokud již výstupní soubor existuje, jak se očekávalo v příkazovém řádku ho zeptal, jestli chci nahradit.

C:\Eclipse\workspace2\sync_inbox>gpg.exe  --passphrase-file ..\BE\src\my.passphrase --decrypt --output MTR241_20111124.htm MTR241_20111124.htm.gpg
Reading passphrase from file descriptor 3
gpg: CAST5 encrypted data
gpg: encrypted with 1 passphrase
File `MTR241_20111124.htm' exists. Overwrite? (y/N) y
gpg: WARNING: message was not integrity protected

Ale tento výstup je z java programu, který visí po tomto prvním řádku. Netiskne každé trati, na konzole. Mám-li vstoupit do ‚Y‘ v konzoli, nepřijímá vstupní a proces. Je to prostě visí. Musím ručně zabít proces taskkill / F / IM gpg.exe teprve pak program java konzola přijímá více příkazů a proces.

C:\Eclipse\workspace2\sync_inbox>gpg.exe  --passphrase-file ..\BE\src\my.passphrase --decrypt --output MTR241_20111124.htm MTR241_20111124.htm.gpg
inp>gpg.exe  --passphrase-file ..\BE\src\my.passphrase --decrypt --output MTR241_20111124.htm MTR241_20111124.htm.gpg
gpg.exe  --passphrase-file ..\BE\src\my.passphrase --decrypt --output MTR241_20111124.htm MTR241_20111124.htm.gpg
    --hangs here-- 

Normální Interaktivní příkazy samozřejmě děl, řekněme pro ex:

F:\eclipse\workspace\HTMLProcessor\BEQuery>copy hello.txt world.txt
inp>copy hello.txt world.txt
copy hello.txt world.txt
Overwrite world.txt? (Yes/No/All): y
inp>y
y
        1 file(s) copied.

Takže tady je moje otázka, proč se to nepodaří zachytit výstupní proud gpg pouze tehdy, když se zeptá na výzvu, zda chcete nahradit existující výstupní soubor.

Už jsem se snažil Runtime.exec (), ProcessBuilder, plexus-utils, ExpectJ, Ant spuštění tohoto gpg.exe uvnitř java programu všechny z nich vykazují stejný výsledek nedokáže zachytit výstupní proud procesu v tomto speciálním případě. Dokonce jsem se snažil napsat bat soubor ke spuštění gpg --decrypt, ale i v tom, že i když dojde k zachycení výstupní proud na výše zvláštní případ.

Myslím, že je to důležité, původ gpg.exe. No já to mám v přenosném distribuci git, v bin složce gpg.exe je k dispozici.

Moje otázka se stala opravdu dlouhá a nudná, ale pro ty, kteří chtěli poukázat na chyby java kód

package com.ycs.ezlink.scheduler.cmd;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import org.apache.log4j.Logger;

public class CmdRunner {
    private static Logger logger = Logger.getLogger(CmdRunner.class);

    static class StreamGobbler extends Thread
    {
        InputStream is;
        String type;

        StreamGobbler(InputStream is, String type)
        {
            this.is = is;
            this.type = type;
        }

        public void run() {
            try {
                System.out.println(in run!);
                    System.out.println(type);
                    final byte[] buffer = new byte[1];
                    for (int length = 0; (length = is.read(buffer)) != -1;) {
                        System.out.write(buffer, 0, length);
                    }
                } catch (IOException ioe) {
                    ioe.printStackTrace();
                }
        }
    }

    public static int process(String cmd){
        int exitVal = 0; 
        try {
            Runtime rt = Runtime.getRuntime();
             Process proc = rt.exec(cmd);
             // any error message?
             StreamGobbler errorGobbler = new 
                 StreamGobbler(proc.getErrorStream(), ERROR);            

             // any output?
             StreamGobbler outputGobbler = new 
                 StreamGobbler(proc.getInputStream(), OUTPUT);

             // kick them off
             errorGobbler.start();
             outputGobbler.start();

             // any error???
             System.out.println(Waiting for cmd process to complete  );
            exitVal = proc.waitFor();
             System.out.println(ExitValue:  + exitVal);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }    
        return exitVal;
    }

    public static void main(String[] a) throws IOException, InterruptedException, TimeoutException, ExpectJException {
        String gzipCmd = gpg.exe  --passphrase-file C:/Eclipse/workspace2/BE/src/my.passphrase --decrypt --output C:/Eclipse/workspace2/sync_inbox/MTR241_20111124.htm C:/Eclipse/workspace2/sync_inbox/MTR241_20111124.htm.gpg;  
        //CmdRunner.process(gzipCmd); ///--fails
        //ProcessBuilder pb = new ProcessBuilder(gpg, --passphrase-file, C:/Eclipse/workspace2/BE/src/my.passphrase,
        --decrypt,--output,C:/Eclipse/workspace2/sync_inbox/MTR241_20111124.htm,
        C:/Eclipse/workspace2/sync_inbox/MTR241_20111124.htm.gpg); ///--fails
        ProcessBuilder pb = new ProcessBuilder (cmd);
        pb.redirectErrorStream(true);
        Process process = pb.start();
        OutputStream stdin = process.getOutputStream ();
        InputStream stderr = process.getErrorStream ();
        InputStream stdout = process.getInputStream ();
         StreamGobbler errorGobbler = new StreamGobbler(stderr, ERROR);            
         errorGobbler.start();
         StreamGobbler stdoutGobbler = new StreamGobbler(stdout, DEBUG);            
         stdoutGobbler.start();

         BufferedReader scan = new BufferedReader(new InputStreamReader(System.in));
         String line;
         while ((line = scan.readLine())!= null) {
                String input = line;
                System.out.println(inp>+input);
                if (input.trim().equals(exit)) {
                    stdin.write(exit\r\n.getBytes()); 
                    stdin.flush();
                    break;
                } else {
                     stdin.write((input+\r\n).getBytes());
                     stdin.flush();
                }
            }
         System.out.println(exited..);
        int returnCode  = process.waitFor();
        System.out.println(returnCode);
    }
}

Jeden poslední slovo, pokud mohu použít gpg --batchmožnost, žádné další výzvy pro y/Nvstup, takže pak to běží hladce. Ale já jsem jen zvědavý, proč tam by to problém. I když mám pocit, že gpg.exe byla původně napsána pro Unix / Linux jako platformu, takže tam mohl být nějaký přesměrování soubor pro vstup a výstup, ale rád bych se dozvědět více o příčinu toho, takže příště vím, co hledat.

Položena 27/11/2011 v 10:17
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
2

Výstup, který vidíte v terminálu je sloučený výsledek ze standardního výstupního streamu standardního chybového streamu a konzole. Můžete zachytit standardní výstup a standardní chybový proud. Ale nemůžete zachytit konzole. To je důvod, proč gpg záměrně využívá konzoli přímo, aby se zabránilo vás od jejich snímání. Proč dělají to je diskutabilní.

Sečteno a podtrženo: nebudete schopni zachytit vstupním nebo výstupním toku programu, který se zabývá přímo s konzolou.

Odpovězeno 09/02/2012 v 18:54
zdroj uživatelem

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