我非常喜欢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);
}
重点是"如果阻止"在前一行之前执行。 runload
是在表中加载信息的脚本,是executeload
的前提条件。在这种情况下,executeload
会抛出java.lang.NullPointerException
。
我的问题是:它是一种控制这段代码流的方法吗?每一行都是下一行的前提条件。我的目的是在最终执行当前时执行下一行。
答案 0 :(得分:0)
println
只是将命令发送(“类型”)到服务器。它不会等待命令完成。
实际上没有办法等待命令完成。 “shell”只是一个带输入和输出的黑盒子。甚至没有办法说出,输出的哪些部分对应于哪个输入。
通常,您应该使用“exec”通道进行自动化。 “shell”通道用于实现交互式终端。
“exec”通道以其命令关闭,因此您可以清楚地告诉命令已完成。然后,您可以打开一个新的“exec”频道以获取更多命令。
请参阅JSch example for "exec" channel。
另见JSch Shell channel execute commands one by one testing result before proceeding。
使用sudo
时,事情变得复杂了。