【问题标题】:How to know whether SFTP was successful or not in WinSCPWinSCP中如何知道SFTP是否成功
【发布时间】:2014-01-11 09:38:37
【问题描述】:

我正在使用以下代码通过 Jsch 运行 SFTP 命令:

public void putfile(){

    try {                      
        String command="winscp /script=D:\\command.txt" ;
        System.out.println(command);
        Runtime rt=Runtime.getRuntime();

        rt.exec(command);
    }
    catch(Exception e) {
        System.out.println("Exception in index.jsp:"+e.getMessage());
    }
}

我正在将 sample.zip 从本地机器放到 Unix 服务器,

command.txt 包含:

option confirm off

open sftp:User:password@IP

get G:\sample.zip /MyFolderLocation/

exit

它工作正常,但每当 SFTP 进程失败时我都没有收到任何异常。有什么方法可以处理它吗?

【问题讨论】:

  • 那不是 jsch。那是runtime.exec。这些是完全不同的东西。
  • @RobinGreen:我知道。我想说的是,我在使用 Jsch jar 文件的代码中使用了运行时类。那么,有没有办法处理呢?
  • 我认为 Jsch 根本与这个问题无关,只是它可能提供有用的答案。

标签: java windows unix runtime.exec winscp


【解决方案1】:

有两种常用的方法可以检测你运行的子进程是否遇到错误:

  1. 检查其退出代码,
  2. 查看它是否将任何错误消息写入标准输出或标准错误。

我不知道 WinSCP 是否在发生错误时设置退出代码,或者将消息写入标准输出或标准错误,但它至少应该执行其中一个。 (它甚至可能两者都做,这是我希望所有表现良好的进程都会做的事情。)您只需尝试 WinSCP 看看会发生什么。

我还建议使用ProcessBuilder 而不是Runtime.getRuntime().exec(...) 来运行命令。如果没有别的,这允许您将标准错误重定向到标准输出,这样您就只有一个流可供读取。

以下是我将代码修改为使用ProcessBuilder 后的样子,获取进程的退出代码并将命令的输出读入字符串:

public void putfile() {

    try {                      
        ProcessBuilder builder = new ProcessBuilder("winscp", "/script=D:\\command.txt");
        builder.redirectErrorStream(true);

        Process process = builder.start();

        // read output from the process
        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        StringBuilder outputBuilder = new StringBuilder();
        String line;
        do {
           line = reader.readLine();
           if (line != null) { outputBuilder.append(line).append('\n'); }
        } while (line != null);

        reader.close();

        String output = outputBuilder.toString();
        // inspect output for error messages.

        int exitCode = process.waitFor();
        // see if exit code is 0 (success) or != 0 (error)
    }
    catch(Exception e) {
        System.out.println("Exception in index.jsp:"+e.getMessage());
    }
}

当然,reader 应该在 finally 块中关闭。为了清楚起见,我没有在上面的代码中这样做。

请注意,在 Java 中运行子进程时,您应该始终阅读子进程的输出,即使您不关心其内容。如果不这样做,输出写入的缓冲区可能会填满,这将导致子进程在想再写入时挂起。

【讨论】:

  • 您好,要查看正在传输的文件的当前状态吗?我试图找到它,但找不到任何有用的信息
  • @Shashank:我从未使用过 WinSCP,所以我不知道在传输文件时 WinSCP 会生成什么输出(如果有的话)。如果它没有产生任何有用的输出,那么你可能无能为力。
【解决方案2】:

请参阅 WinSCP 常见问题解答How do I know that script completed successfully?

您可以通过 WinSCP 退出代码来判断脚本的结果。代码 0 表示成功,而 1 表示错误。有关更多详细信息,请参阅 到scripting 文档。

一旦发生任何错误,批处理脚本(使用 /script/command command-line switches 指定)立即以代码 1 终止。

要找出脚本失败的原因,请检查 session log

示例见guide to transfer automation

【讨论】:

    猜你喜欢
    • 2011-08-10
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多