仅在JSch shell通道中获取特定命令的输出

时间:2016-08-11 06:10:07

标签: java shell jsch

我正在尝试使用JSch在java中获取shell脚本的输出。执行sudo admin命令并获取脚本的输出。

Properties prop = new Properties();
InputStream input = null;

String host="myhost";
StringBuilder command1= new StringBuilder();
String userName = "root";
String password="password";

try{

    JSch jsch = new JSch();
    Session session = jsch.getSession(userName, host, 22);

    session.setPassword(password);
    session.connect();
    System.out.println("Connected");

    List<String> commands = new ArrayList<String>();
    commands.add("ls");
    commands.add("sudo myadmincmd");
    commands.add("cd /logs");
    commands.add("my script...");
    Channel channel = session.openChannel("shell"); 
    channel.connect();
    channel.setOutputStream(System.out);

    OutputStream os = channel.getOutputStream();
    PrintStream shell = new PrintStream(os, true);

    for (String cmd : commands) {
        shell.println(cmd);
        try {
            Thread.sleep(2000);
        }
        catch (Exception ee) {
        }
    }
    shell.println("exit");
    shell.close();

    channel.disconnect();
    session.disconnect();

}catch(Exception e){
    e.printStackTrace();
}

输出:

*ADMINSHELL* :/home/abcd # cd /logs
*ADMINSHELL* :/logs # 
*ADMINSHELL* :/logs # my script...
....
output goes here...
....

如何才能获得此ADMINSHELL的输出?例如,我只需要最终输出。我尝试使用如下检查,

for (String cmd : commands) {
    if(cmd.startsWith("for script")){
        shell.println(cmd);
    }

    try {
        Thread.sleep(2000);
    }
    catch (Exception e) {
    }
}

但这次我得到一些许可被拒绝的问题。我只需要最后一个脚本的输出。

....
output goes here...
....

1 个答案:

答案 0 :(得分:1)

您必须将输出读取到某个缓冲区/字符串。然后解析并仅打印您想要的部分。

请参阅How to get jsch shell command output in String

没有其他方法可以分开各个命令的输出。从SSH客户端的角度来看,shell只是一个带输入/输出的黑盒子。没有结构。

当您在脚本之前和之后打印一些分隔符时会有所帮助:

echo ---begin---
/.../myscript.sh   
echo ---end---