2015-04-22 11 views
6

Đây là một phần của mã của tôi để sao chép tập tin từ địa phương đến một máy từ xaJava runtime exec với lệnh 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(); 
} 

đầu ra là ...

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

nhưng khi tôi chạy lệnh trong terminal trên máy cục bộ, nó hoạt động tốt và khi tôi chạy ll các tập tin đang có

-rwxr-xr-x 1 Freddie Freddie 140 tháng tư 22 09:13 gc00cn00150420092629.csv *

-rwxr-xr-x 1 Freddie Freddie 105 ngày 22 tháng 4 09:13 gc00cn00150420122656.csv *

Bất kỳ sự giúp đỡ xin vui lòng

Trả lời

1

Khi bạn chạy lệnh với trong bash với ký tự đại diện như * trong đó, bash sẽ mở rộng lệnh đó và trong trường hợp của bạn, thay thế *.csv bằng danh sách tệp kết thúc bằng .csv, nhưng trong chương trình java của bạn, điều này sẽ không xảy ra.

Theo this answer, bạn có thể làm như sau:.

  • Sử dụng file.listFiles() để có được danh sách các file
  • Sử dụng file.getName() chứa (string) để lọc chúng nếu cần thiết
  • lặp qua mảng và thực hiện scp hoặc làm điều đó với toàn bộ danh sách

hoặc nhờ @James Anderson bình luận thêm sh trước scp trong lệnh của bạn.

+0

điều kỳ lạ là sử dụng cùng một lệnh, sao chép tệp từ xa sang máy cục bộ của tôi * .csv hoạt động tốt, tuy nhiên, bằng cách sử dụng * .csv từ Cục bộ đến từ xa, đó là khi sự cố xảy ra. Ant ý tưởng? Cảm ơn –

+0

Đó là vì scp sẽ giải thích lệnh đó ở máy chủ từ xa (và có thể trong bash), và danh sách các tệp sẽ được mở rộng trên máy chủ đó, chứ không phải cục bộ. Nhưng khi bạn thử địa phương để trao đổi tập tin từ xa, không có bash để mở rộng nó. – Mehraban

+0

cảm ơn bạn đã trả lời nhanh chóng, sẽ thử. –

0

Nếu bạn đang sử dụng java 7 trở lên bạn nên sử dụng ProcessBuilder thay vì Runtime.getRuntime().exec() và trong ProcessBuilder bạn có thể specipied thư mục thực hiện:

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

Theo this, bạn nên thử:

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

Tôi đã thử nghiệm với /bin/sh/bin/bash, cả hai đã sao chép các tệp thành công

Các vấn đề liên quan