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

沙申克·维维克

我正在使用以下代码通过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进程失败时,我都不会出现任何异常。是否有任何方法可以处理它?

卢克·伍德沃德

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

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

我不知道WinSCP是否在发生错误时设置退出代码,或将消息写入标准输出或标准错误,但是它至少应执行其中之一。(它甚至可能两者都做,这是我期望所有行为良好的过程都可以做的。)您只需要试用WinSCP并查看会发生什么。

我还建议使用aProcessBuilder代替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中运行子流程时,即使您不关心其内容,也应始终阅读该子流程的输出。如果不这样做,则输出写入的缓冲区可能会填满,这将导致子进程在要写入更多内容时挂起。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何知道注册是否成功

在JDBC中,如何知道DDL语句是否成功执行?

如何知道ffmpeg转换在Ruby中是否成功?

我如何知道交易代码是否成功?

如何知道Unix命令执行是否成功

如何知道urllib.urlretrieve是否成功?

如何知道“ fputcsv”是否已成功执行

如何知道FMDB查询是否成功

如何知道构建是否成功完成

如何知道BPM流程是否成功

如何知道使用PayPal.Net SDK在PayPal Web API中删除方法是否成功

Swift-如何知道文件是否成功保存在.cachesDirectory中

如何知道在Pubnub中取消订阅频道请求是否成功?

如何检查SFTP会话是否已成功验证

如何知道我是否在解析时成功发送数据(Android)

如何知道react-native-git-upgrade是否成功?

如何知道查询是否成功或节点和猫鼬失败

我如何知道Firestore上的交易是否成功?

如何知道每个查询是否在循环中成功执行?

如何获取 $wpdb ->query 的结果以知道是否成功

解释SFTP成功-WinSCP-XML日志文件

Powershell 和 WinSCP 脚本来检查 SFTP 远程目录中是否有超过 4 个文件

在QSqlTableModel中使用QSqlTableModel.OnFieldChange editStrategy时如何知道数据库中的数据是否更新成功?

如何使用硬编码密码在PowerShell中的WinSCP SFTP脚本中修复安全性

如何使用WinSCP将名称中具有特定关键字的文件上传到SFTP

如何知道是否在tkinter中单击了按钮?

如何知道是否在javascript中单击了按钮?

我如何知道我是否在子弹中

如何知道流程是否在JBPM中结束