流程执行Java JSsh

时间:2017-07-31 13:37:36

标签: java unix ssh jsch

我非常喜欢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

我的问题是:它是一种控制这段代码流的方法吗?每一行都是下一行的前提条件。我的目的是在最终执行当前时执行下一行。

1 个答案:

答案 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时,事情变得复杂了。

请参阅Running command after sudo login