java - 从 java 执行的 rsync 返回文件未找到错误

标签 java ssh rsync apache-commons-exec

我正在尝试使用 Apache Commons Exec 库执行 rsync 命令(在本地进行 atm 测试),但我收到一条错误消息,而在终端中执行相同的命令时没有显示任何问题。

这是我要执行的命令:

rsync -zve "ssh -i /home/user/.ssh/testkey" /home/user/playground/src/HNI_0084.JPG user@localhost:/home/user/playground/dst

这是我在 Java 类中执行命令时收到的错误消息:

rsync: Failed to exec ssh -i /home/user/.ssh/testkey: No such file or directory (2)
rsync error: error in IPC code (code 14) at pipe.c(84) [sender=3.0.9]
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in IPC code (code 14) at io.c(605) [sender=3.0.9]
org.apache.commons.exec.ExecuteException: Process exited with an error: 14 (Exit value: 14)
    at org.apache.commons.exec.DefaultExecutor.executeInternal(DefaultExecutor.java:377)
at org.apache.commons.exec.DefaultExecutor.execute(DefaultExecutor.java:160)
at org.apache.commons.exec.DefaultExecutor.execute(DefaultExecutor.java:147)
    at LocalExecutor.execute(LocalExecutor.java:21)

是的,这是我用于执行本地命令的 java 类:

import java.io.IOException;

import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecutor;
import org.apache.commons.exec.ExecuteWatchdog;

public class LocalExecutor {

    public int execute(String command, String[] args) {
        CommandLine cl = new CommandLine(command);
        cl.addArguments(args);
        System.out.println(cl.toString());

        DefaultExecutor executor = new DefaultExecutor();
        ExecuteWatchdog watchdog = new ExecuteWatchdog(60000);
        executor.setWatchdog(watchdog);
        int exitValue = 0;
        try {
            exitValue = executor.execute(cl);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return exitValue;
    }

}

最后,传递给程序的参数数组是这样的:

{-zve, ssh -i /home/user/.ssh/testkey, /home/user/playground/src/HNI_0084.JPG, user@localhost:/home/user/playground/dst/}

完全不知道为什么 rsync 会提示调用,因为包含空格的参数的引用由库处理,实际的 rsync 调用看起来应该与我上面发布的行完全一样。

有什么想法吗? :/

最佳答案

从您的 java 代码执行时,rsync 可能找不到 ssh。尝试使用 ssh 可执行文件的完整路径,而不是仅仅传递命令。

关于java - 从 java 执行的 rsync 返回文件未找到错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16595339/

相关文章:

ssh - 多服务器部署 : asking ssh password for each server

linux - 使用 xargs(并行)时如何获取退出代码

linux - 使用 lsyncd 同步多个目录

java - 将 JavaDStream<String> 转换为 JavaRDD<String>

java - 在Java中表示可变长度矩阵(二维数组)的最佳方式?

c++ - 使用 system() 执行 ssh 命令

linux - Ansible 'synchronize' 覆盖文件夹,即使 delete=no

java - af :Calendar component, 按列类型过滤

java - 如果socketaccept导致异常,如何找出原因?

linux - bash 在此 ssh 命令中做了什么?