【问题标题】:Java runtime exec with scp command带有 scp 命令的 Java 运行时 exec
【发布时间】:2015-04-22 03:29:28
【问题描述】:

这是我将文件从本地复制到远程机器的代码的一部分

try {
Process cpyFileLocal = Runtime.getRuntime().exec("scp  " + rFile+"*.csv"     + " root@" + 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" +"  root@"+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 root@10.50.1.29:/opt/jrms/transfer/incoming/

但是当我在本地机器上的终端中运行命令时,它工作正常 当我运行 ll 文件就在那里

-rwxr-xr-x 1 弗雷迪弗雷迪 140 Apr 22 09:13 gc00cn00150420092629.csv*

-rwxr-xr-x 1 弗雷迪弗雷迪 105 Apr 22 09:13 gc00cn00150420122656.csv*

请帮忙

【问题讨论】:

    标签: java


    【解决方案1】:

    如果您使用的是 java 7 及更高版本,则应使用 ProcessBuilder 而不是 Runtime.getRuntime().exec() 并且在 ProcessBuilder 中您可以指定执行目录:

     ProcessBuilder pb = new ProcessBuilder("scp", rFile+"*.csv", "root@" + 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();
    

    【讨论】:

      【解决方案2】:

      当您在 bash 中使用通配符(如 *)运行命令时,bash 将扩展该命令,在您的情况下,将 *.csv 替换为以 .csv 结尾的文件列表,但在您的 java 程序中,此不会发生。

      根据this answer,您可以执行以下操作:

      • 使用 file.listFiles() 获取文件列表
      • 如果需要,使用 file.getName().contains(string) 过滤它们
      • 遍历数组并执行scp 或对整个列表执行此操作

      或感谢@James Anderson 评论在您的命令中在scp 之前添加sh

      【讨论】:

      • 奇怪的是使用相同的命令,将文件从远程复制到我的本地机器 *.csv 工作正常,但是,使用 *.csv 从本地到远程,这就是问题发生的时候。蚂蚁的想法?谢谢
      • 这是因为 scp 将在远程服务器(可能在 bash 中)解释该命令,并且文件列表将在该主机上展开,而不是在本地展开。但是当你尝试本地到远程文件交换时,没有 bash 来扩展它。
      • 或者你可以在“scp”之前添加一个“sh”shell命令
      • @SAM 感谢您的意见。现在似乎可以正常工作了
      【解决方案3】:

      根据this,你应该试试:

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

      我用/bin/sh/bin/bash测试,都成功复制了文件

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-01-03
        • 2017-09-16
        • 2013-04-16
        • 1970-01-01
        • 2011-05-07
        • 2012-11-08
        • 2015-02-23
        相关资源
        最近更新 更多