2015-04-22 154 views
6

这是我的代码从本地文件复制到远程机器使用scp命令Java运行EXEC

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

输出的一部分...

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

但是当我运行在本地机器上的终端命令,它工作正常 当我运行LL的文件是有

-rwxr-XR-X 1房地美房地美140四月22 09:13 gc00cn00150420092629.csv *

-rwxr-XR-X 1房地美房地美105 04月22日09:13 gc00cn00150420122656.csv *

任何帮助,请

回答

1

当你在bash命令运行与像*这样的通配符,bash会扩展这个命令,在你的情况下,将*.csv替换为以.csv结尾的文件列表,但是在你的java程序中,这不会发生。

this answer,你可以做到以下几点:

  • 使用file.listFiles()来获取文件
  • 使用file.getName()的列表中包含(字符串)来过滤他们,如果需要的
  • 迭代这个数组并执行scp或整个列表做

或由于@James Anderson添加注释sh之前scp在您的命令。

+0

奇怪的是使用相同的命令,将文件从远程复制到本地计算机* .csv可以正常工作,但是,使用* .csv从本地到远程,即发生问题时。蚂蚁想法?谢谢 –

+0

这是因为scp会在远程服务器(可能是bash)解释该命令,并且文件列表将在该主机上展开,而不是在本地展开。但是当你尝试本地到远程文件交换时,没有bash来扩展它。 – Mehraban

+0

感谢您的及时回复,请试一试。 –

0

如果您使用的是Java 7及以上的,你应该使用ProcessBuilder代替Runtime.getRuntime().exec()并在ProcessBuilder可以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

this,你应该尝试:

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

我使用/bin/sh/bin/bash进行了测试,两者均成功复制文件