我对Java很不在行,所以如果这是一个空洞的问题,请原谅。我有以下代码,执行流程与我的意图不同:
channel = session.openChannel("shell");
OutputStream ops = channel.getOutputStream();
PrintStream ps = new PrintStream(ops, true);
channel.connect();
String sudo = "sudo su - user";
String copy = "copy from a to b;
String cd = "cd a directory";
String runload = "run a scrip in unix;
String cd1 = "cd a directoryu";
String executeload = "run a scrip in unix";
ps.println(sudo);
ps.println(copy);
ps.println(cd);
ps.println(runload);
ps.println(cd1 );
if (db.runload().contains("SUCCESS")) {
ps.println(executeload);
//execute this only if runload was success
} else {
System.exit(1);
}关键是"if block“在前面的行之前执行。runload是将信息加载到表中的脚本,是executeload的前提条件。在这种情况下,executeload将抛出java.lang.NullPointerException。
我的问题是:这是一种控制这段代码中的流的方法吗?每一行都是下一行的前提条件。我的意图是在最后执行current时执行下一行。
发布于 2017-08-01 15:46:56
println只是将命令发送(“键入”)到服务器。它不会等待命令完成。
实际上,没有办法等待命令完成。"shell“只是一个有输入和输出的黑盒。甚至无法分辨输出的哪些部分对应于哪个输入。
通常,您应该使用"exec“通道来实现自动化。"shell“通道旨在实现交互式终端。
"exec“通道以其命令结束,因此您可以清楚地知道命令已经结束。然后,您可以为进一步的命令打开一个新的"exec“通道。
参见JSch example for "exec" channel。
另请参见JSch Shell channel execute commands one by one testing result before proceeding。
不过,使用sudo会使事情变得复杂。
https://stackoverflow.com/questions/45417505
复制相似问题