Newsgroup: it.comp.os.linux.development
Titolo: Comunicazione fra processi in java

Salve a tutti.
Sto scrivendo un programma in java con netbeans sotto linux. Questo 
programma deve utilizzare gpg per fare il suo lavoro. Quando cripto un 
file non ho nessun tipo particolare di problema in quanto lanciando 
l'eseguibile gpg più i vari parametri da Runtime().exec("gpg + 
parametri") non ho nessun bisogno di "dialogare" con gpg.
Il problema sorge quando devo decriptare un file in quanto gpg 
giustamente mi chiede la password. Ho risolto in modo molto "sporco" 
lanciando uno script con expect che lancia gpg e gli fornisce la 
password. Il tutto è però molto complicato e "poco portabile" in quanto 
basta anche che cambio la lingua di sistema per dover ricambiare tutto. 
Purtroppo gpg non supporta la password da linea di comando e quindi ho 
risolto cos'. Però c'è un modo più pulito ed ortodosso per poter dire al 
programma qual'è la password al momento che la chiede?
Ringrazio in anticipo chi vorrà darmi qualche suggerimento!
Ciao
WildEagle

WildEagle ha scritto:

Prova così:
Process p = Runtime.getRuntime().exec(...)
OutputStream os = p.getOutputStream();
os.write(STR_PASSWD+"\n").getBytes());
os.close();
int i = p.waitFor();
Ciao.

 Ciao.
Grazie per avermi risposto! Ho provato adattando il tuo codice, ma 
purtroppo non funziona! Credo che sia proprio gpg ad impedire che il suo 
standard input (e quindi OutputStream del mio programma in java) venga 
rediretto. Infatti se tramte Runtime.getRuntime().exec(..) lancio "cat" 
invece di "gpg + ovvi parametri" la stringa scritta tramite 
os.write(stringa.getBytes()) mi viene ritornata sullo standard output 
mentre se lancio gpg no.
Qualche altro suggerimento? Se sono stato orribilmente oscuro nello 
spiegare posso postare le dieci righe del programma se occorre!
Grazie
Ciao
WildEagle

 parametri") non ho nessun bisogno di "dialogare" con gpg.
Forse questo fa al caso tuo:
 
http://lists.gnupg.org/pipermail/gnupg-devel/2002-February/018098.html
Barone Frankenstein
-- 
There is no place like /home.

 Barone Frankenstein
Grazie! Adesso mi copio il sorgente, domani lo provo... speriamo funzioni!
Ciao
WildEagle

 Barone Frankenstein
Restituisco alla comunità!
Ecco la classe che ho creato grazie ai vostri consigli. Grazie a questa 
classe si può codificare e decodificare un file con gnupg.
Grazie ancora!
Ciao
WildEagle
GnuPG.java:
import java.io.*;
public class GnuPG {
	private Process p;
 
GnuPG()
	{
	}
	public void encrypt(String inpathname, String outpathname, String rcpt)
	/*Encrypting files using gpg
          *inpathname = source file to encrypt
          *outpathname = destination file
          *rcpt = public key to use
          */
         {
             try{
 
                 String[] commands = new String[]{"gpg", 
"-o",outpathname,"-a","--batch",
 
"--no-tty","--yes","-r",rcpt,"--encrypt",inpathname};
                 Process p=Runtime.getRuntime().exec(commands);
                 try {
                         p.waitFor();
                     }  catch (InterruptedException interr){
                             System.out.println("Interr: 
"+interr.getMessage());
                     }
	    } catch (IOException proc) {
                 System.out.println("Proc: "+proc.getMessage());
             }
         }
	public void decrypt(String inpathname, String outpathname, String 
passphrase)
         /*Decrypting files using gpg
          *inpathname = source file to decrypt
          *outpathname = destination file
          *passphrase=?
          */
	{
             try{
                 String[] commands = new String[]{"gpg", 
"-o",outpathname,"--batch",
 
"--no-tty","--yes","--passphrase-fd","0","--decrypt",inpathname};
                 Process p=Runtime.getRuntime().exec(commands);
                 OutputStream out=p.getOutputStream();
                 passphrase+="\n";
                 out.write(passphrase.getBytes());
                 out.close();
                 try {
                         p.waitFor();
                     }  catch (InterruptedException interr){
                             System.out.println("Interr: 
"+interr.getMessage());
                     }
                 InputStream err=p.getErrorStream();
                 int c;
                 while ((c = err.read()) != -1) {
                         System.out.print((char)c);
                     }
                 err.close();
                 }catch (IOException proc){
                     System.out.println("Proc: "+proc.getMessage());
                     }
 
	}
}

 giustamente mi chiede la password.
Senza considerare l'innegabile qualita` di GnuPG, perche` non utilizzi le
librerie javax.crypto.* per la crittazione dei file? In questa maniera ti
ritroveresti meno legato ad altre applicazioni e saresti piu` libero di
muoverti
Henryx
P.S. le librerie javax.crypto.* supportano i piu` diffusi algoritmi di hash
e di crittazione con chiave. Inoltre, se proprio non trovi l'algoritmo da
te scelto in tali librerie, basta che cerchi in giro su internet per
trovare cio` che ti interessa

 muoverti
Non conosco bene il linguaggio Java e ho paura che eventuali miei errori 
nella scelta dei vari parametri possa rendere poco efficace la 
crittazione. Grazie del consiglio! Appena posso mi metterò a studiare 
come funziona javax.crypto, perché è innegabile il vantaggio di avere 
tutto il programma che lavora solo con la JVM senza altri software di 
contorno.
Ciao
WildEagle