2015-04-22 41 views
6

Bu ...Java çalışma zamanı exec

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

uzak makinede

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

çıkışı yerel dosyaları kopyalamak benim kod parçasıdır ama çalıştırdığınızda yerel makinede terminalde komut, iyi çalışıyor ve ben ll çalıştırdığınızda dosyalardır orada

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

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

Herhangi bir yardım lütfen

cevap

1

Birlikte bash ile komutu çalıştırmak İçinde * gibi joker karakterler, bash bu komutu genişletecek ve sizin durumunuzda *.csv'un yerine .csv ile biten dosyaların listesini değiştirecektir, ancak java programınızda bu olmayacaktır. this answer göre

, aşağıdaki yapabilirsiniz. Gerekirse

  • Kullanım file.listFiles() dosyaları
  • Kullanım file.getName() listesini almak için onları süzmek için (dize) içeren
  • dizinin üzerinde Bıkmadan veeklemek @James Anderson yorumuna

veya teşekkür scp gerçekleştirmek veya tüm listesi ile bunu Emrinizde scp önce 0.

+0

tuhaf bir şey aynı komutu kullanarak, uzaktaki dosyaları yerel makineme * kopyalama * .csv iyi çalışıyor, ancak yerelden uzaktaki * .csv'yi kullanarak sorun ortaya çıkıyor. Karınca fikirleri? teşekkürler –

+0

Çünkü scp bu komutu uzak sunucuda (ve muhtemelen bir bash'ta) yorumlayacaktır ve dosyaların listesi yerel olarak değil, bu ana bilgisayarda genişletilecektir. Ancak yerel dosya paylaşımını yerel olarak denediğinizde, genişletmek için bir bash yoktur. – Mehraban

+0

Hızlı cevap için teşekkürler, bir deneyin verecektir. –

0

Eğer java 7 kullanıyorsanız ve bunun yerine Runtime.getRuntime().exec() ait ProcessBuilder kullanmalıdır yukarıda ve ProcessBuilder size yürütme dizini specipied edebilirsiniz:

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

this göre, denemelisiniz:

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

/bin/sh ve /bin/bash ile test ettim, her ikisi de dosyaları başarıyla kopyaladı

İlgili konular