gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 11:54:21 26 4
gpt4 key购买 nike

我正在使用以下代码通过 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,看看会发生什么。

我还建议使用 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 block 中关闭。为清楚起见,我没有在上面的代码中这样做。

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

关于java - 在 WinSCP 中如何知道 SFTP 是否成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21060737/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com