我使用下面的代码通过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>
答案 0 :(得分: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中运行子进程时,即使您不关心其内容,也应始终读取子进程的输出。如果不这样做,输出写入的缓冲区可能会填满,如果要再写入,则会导致子进程挂起。
答案 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。