2015-04-22 18 views
6

Dies ist ein Teil meines Code-Dateien von den lokalen zu einem entfernten Maschine istJava-Runtime-exec mit scp Befehl

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(); 
} 

die Ausgabe zu kopieren ...

<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/ 

aber wenn ich laufe die Befehl im Terminal auf dem lokalen Rechner, es funktioniert gut und wenn ich ll die Dateien laufen dort

-rwxr-xr-x 1 freddie freddie 140 April 22 09.13 gc00cn00150420092629.csv *

-rwxr-xr-x 1 freddie freddie 105 22. April 09.13 gc00cn00150420122656.csv *

Jede Hilfe bitte

Antwort

1

Wenn Sie Befehl mit in bash laufen mit Wildcards wie * drin, bash wird diesen Befehl erweitern und ersetzt in Ihrem Fall *.csv mit einer Liste von Dateien, die mit .csv enden, aber in Ihrem Java-Programm wird dies nicht passieren.

Nach this answer, können Sie folgendes:.

  • Verwenden file.listFiles() die Liste der Dateien
  • Verwenden file.getName() zu erhalten enthält (string), um sie zu filtern, wenn nötig
  • Iterate über die Anordnung und führen scp oder tut es mit ganzer Liste

oder mit dank @James Anderson Kommentar hinzufügen sh vor scp in Ihrem Befehl.

+0

die seltsame Sache ist die Verwendung des gleichen Befehls, Kopieren von Dateien aus der Ferne auf meine lokale Maschine * .csv funktioniert gut, jedoch mit * .csv von Local nach remote, das ist, wenn das Problem auftritt. Ameisen Ideen? Danke, –

+0

Es ist, weil scp diesen Befehl auf Remote-Server (und wahrscheinlich in einer Bash) interpretiert, und die Liste der Dateien wird auf diesem Host, nicht lokal erweitert werden. Wenn Sie jedoch versuchen, den Dateiaustausch lokal zu remote durchzuführen, gibt es keine bash, um sie zu erweitern. – Mehraban

+0

danke für die schnelle Antwort, werde es versuchen. –

0

Wenn Sie mit Java 7 und höher Sie ProcessBuilder statt Runtime.getRuntime().exec() und in der ProcessBuilder verwenden sollten, können Sie das Ausführungsverzeichnis specipied:

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

Nach this, sollten Sie versuchen:

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

Ich habe mit /bin/sh und /bin/bash getestet, beide kopierten die Dateien erfolgreich