使用Java的ProcessBuilder调用PSCP时,如何遍历父目录?

问题描述

我正在使用以下代码从Java调用pscp:

public static ArrayList<String> runWindowsCommand(String... args) throws WindowsCmdFault {
        try {
              ProcessBuilder pb = new ProcessBuilder(args);
              Process p = pb.start();


              //...
              //... code to fetch the output and return it back


            }catch (IOException | InterruptedException e) {
              e.printstacktrace();
            }

    }

我将此函数称为如下:

runWindowsCommand("C:\Program Files (x86)\PuTTY\pscp" -pw "password" -r folder/file_to_be_transferred.txt "username@hostname:/remote/unix/server/location/folder_name")

这执行得很好,并显示以下输出

Arraylist returned (output) = 
[,file_to_be_transferred.txt                | 3 kB |   2.7 kB/s | ETA: 00:00:00 | 100%]

似乎转移成功。除了我通过腻子登录到远程Unix服务器并检查该文件外,显示没有任何更新。

文件的权限已设置为 666。

当我直接在 cmd提示上执行相同的命令(我们要发送给函数的命令)时,它给出的输出相同,文件实际上是 转移。

当我通过上面给出的Java代码运行相同的命令时,该文件实际上并未传输。

PSCP为什么不传输文件

更新:在进一步调查和@Martin Prikryl的大力支持下,我能够将问题缩小到根本原因。

根本原因: 问题是,当从PSCP建立用户连接时,认情况下它将连接到 (root)/home/username

我们需要遍历的目录位于

(root)/www/....lengthy/folder/here .

仍然存在的问题:

我正在尝试在连接后向上遍历文件夹。我正在尝试添加一个双周期,以便在提供路径之前朝根向上移动。但这不起作用。

我正在尝试使用pscp作为远程主机名:

../../www/..lengthy/folder/here 

但是通过Java执行此操作由于某种奇怪的原因而失败,但可以通过cmd提示符工作。

如何在添加实际路径之前添加包含第二个父级的远程路径?

解决方法

使用Java + PSCP似乎有一些限制。我通过将文件上传到默认目录解决了这个问题。之后,我通过腻子的命令行建立连接,并将文件传输到所需的目标位置。我将答案放在这里。