【问题标题】:Java - ProcessBuilder rsync command with password failsJava - 带有密码的 ProcessBuilder rsync 命令失败
【发布时间】:2023-10-24 21:45:01
【问题描述】:

我正在尝试通过 rsync 传输文件。

这是我的 sn-p:

ProcessBuilder builder = new ProcessBuilder("rsync", "-az", "-e", "ssh -q -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/null -oPubkeyAuthentication=no", username + "@" + host + ":" + filePath, destPath);
Process process = builder.start();
InputStream errorStream = process.getErrorStream();

// Password
OutputStream outputStream = process.getOutputStream();
outputStream.write(password.getBytes(StandardCharsets.UTF_8));

// Wait for execution
int exitValue = process.waitFor();
if (exitValue != 0) {
    String errorMessage = read(errorStream);
    System.out.println(errorMessage);
}

这是错误信息:

rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: unexplained error (code 255) at io.c(226) [Receiver=3.1.0]

我可以确认方法参数(例如密码、用户名、主机等)不为空且有效。我也可以使用 CLI 成功运行相同的 rsync 命令。

我发现了一个类似的问题here 并尝试了带或不带引号的 SSH 选项,但它不起作用。

这是运行程序时ps aux | grep rsync 的输出:

emre      8566  0.0  0.0  17396   908 ?        S    18:15   0:00 rsync -az -e ssh -q -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/null -oPubkeyAuthentication=no user@XXXX:/tmp/dummy-file /tmp/
emre      8568  0.3  0.0  36148  3028 ?        S    18:15   0:00 ssh -q -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/null -oPubkeyAuthentication=no -l user XXXX rsync --server --sender -logDtprze.iLs . /tmp/dummy-file

我在这里缺少什么?这是使用ProcessBuilder的正确方法吗?

提前致谢

【问题讨论】:

    标签: java linux process rsync processbuilder


    【解决方案1】:

    Rsync 本身不处理身份验证,而是由 ssh-agent 处理。 将密码写入处理输出流是错误的:它没有将密码传递给 ssh-agent。相反,您可以设置环境变量RSYNC_PASSWORD=<password>

    【讨论】:

      最近更新 更多