2015-04-22 14 views
6

Questa è una parte del mio codice per copiare i file da locale a un computer remotoJava runtime con exec comando scp

try { 
Process cpyFileLocal = Runtime.getRuntime().exec("scp " + rFile+"*.csv"  + " [email protected]" + host + ":" + lFile); 
InputStream stderr = cpyFileLocal.getErrorStream(); 
InputStreamReader isr = new InputStreamReader(stderr); 
BufferedReader br = new BufferedReader(isr); 
String line = null; 
System.out.println("<ERROR>"); 
while ((line = br.readLine()) != null) { 
System.out.println(line); 
} 
System.out.println("</ERROR>"); 
int exitVal = cpyFileLocal.waitFor(); 
System.out.println("Process exitValue: " + exitVal); 
System.out.println("...." + cpyFileLocal.exitValue()); 
System.out.println("SCP COMMAND "+"scp "+rFile+"*.csv" +" [email protected]"+host+":"+lFile); 
System.out.println("Sending complete..."); 
} catch (Exception ex) { 
ex.printStackTrace(); 
} 

l'uscita è ...

<ERROR> 

    /opt/jrms/rmsweb/transfer/cn00/outgoing/*.csv: No such file or directory 
    </ERROR> 

    Process exitValue: 1 

    ....1 

    SCP COMMAND scp /opt/jrms/rmsweb/transfer/cn00/outgoing/*.csv [email protected]:/opt/jrms/transfer/incoming/ 

ma quando ho eseguito il comando nel terminale sulla macchina locale, funziona benissimo e quando corro ll i file sono lì

-rwxr-xr-x 1 freddie freddie 140 aprile 22 09:13 gc00cn00150420092629.csv *

-rwxr-xr-x 1 freddie freddie 105 22 Apr 09:13 gc00cn00150420122656.csv *

Qualsiasi aiuto per favore

risposta

1

Quando si esegue il comando con in bash con jolly come *, bash espande tale comando e nel tuo caso, sostituisce *.csv con l'elenco di file che termina con .csv, ma nel tuo programma java, questo non accadrà.

Secondo this answer, si può fare seguenti:.

  • Usa file.listFiles() per ottenere l'elenco dei file
  • Usa file.getName() contiene (stringa) per filtrare loro se necessario
  • iterare l'array ed eseguire scp o farlo con tutta la lista

o con grazie al @James Anderson commento aggiungere sh prima di scp nel tuo comando.

+0

la cosa strana sta usando lo stesso comando, copiando i file dal remoto al mio computer locale * .csv funziona bene, tuttavia, usando * .csv da Local a remote, questo è il momento in cui si verifica il problema. Idee di formiche? grazie –

+0

È perché scp interpreterà quel comando sul server remoto (e probabilmente in una bash), e l'elenco dei file verrà espanso su quell'host, non localmente. Ma quando si prova lo scambio di file locale a quello remoto, non vi è alcun motivo per espanderlo. – Mehraban

+0

grazie per la pronta risposta, ci proveremo. –

0

Se si utilizza Java 7 e, soprattutto, si dovrebbe usare ProcessBuilder invece di Runtime.getRuntime().exec() e nel ProcessBuilder è possibile specipied la directory di esecuzione:

ProcessBuilder pb = new ProcessBuilder("scp", rFile+"*.csv", "[email protected]" + host + ":" + lFile); 
Map<String, String> env = pb.environment(); 
env.put("VAR1", "myValue"); 
env.remove("OTHERVAR"); 
env.put("VAR2", env.get("VAR1") + "suffix"); 
pb.directory("directory where the csv files located"); 
Process p = pb.start(); 
0

Secondo this, si dovrebbe provare:

Process cpyFileLocal = Runtime.getRuntime().exec(new String[] {"/bin/sh","-c", "scp " + rFile+"*.csv"  + " [email protected]" + host + ":" + lFile}); 

Ho provato con /bin/sh e /bin/bash, entrambi i file sono stati copiati correttamente con successo

Problemi correlati