如何知道SFTP在WinSCP中是否成功

时间:2014-01-11 09:38:38

标签: java windows unix runtime.exec winscp

我使用下面的代码通过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进程失败时我都没有得到任何异常。有没有办法处理它?<​​/ p>

2 个答案:

答案 0 :(得分:2)

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

  1. 检查其退出代码,
  2. 查看它是否将任何错误消息写入标准输出或标准错误。
  3. 我不知道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中运行子进程时,即使您不关心其内容,也应始终读取子进程的输出。如果不这样做,输出写入的缓冲区可能会填满,如果要再写入,则会导致子进程挂起。

答案 1 :(得分:0)

请参阅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