使用JSch和Java捕获服务器命令输出

使用JSch和Java捕获服务器命令输出,java,ssh,stdout,jsch,Java,Ssh,Stdout,Jsch,我使用JSch来ssh到多个服务器,并运行一些命令。我的输出文件捕获了所有内容。但是我正在寻找一种只捕获服务器响应的方法 代码: 电流输出: 上次登录:2016年1月14日星期四15:06:17从192.168.1.4开始 mypc:~用户$ mypc:~用户$hostname mypc mypc:~用户$df-l | grep disk0s3 | tr-s[:blank:| cut-d'-f 7 19098537 但我只想输出以下内容 mypc 19098537 这是以下两个命令的结果 主

我使用JSch来ssh到多个服务器,并运行一些命令。我的输出文件捕获了所有内容。但是我正在寻找一种只捕获服务器响应的方法

代码:

电流输出:

上次登录:2016年1月14日星期四15:06:17从192.168.1.4开始
mypc:~用户$
mypc:~用户$hostname
mypc
mypc:~用户$df-l | grep disk0s3 | tr-s[:blank:| cut-d'-f 7
19098537
但我只想输出以下内容

mypc 19098537
这是以下两个命令的结果

主机名
df-l | grep disk0s3 | tr-s[:blank:| cut-d'-f7

使用
exec
频道,而不是
shell
频道。
exec
通道用于执行命令。
shell
频道用于实现交互式会话。这就是为什么你会得到所有的提示等等。您无法在
exec
频道中获取这些信息

如果您需要阅读stdout和stderr,请参阅我的答案

try (OutputStream log = new BufferedOutputStream( new FileOutputStream("OUTPUT_FILE"))) {
    JSch jsch = new JSch();

    for (String host : jssh.listOfhost()) {
        Session session = jsch.getSession(user, host, 22);
        session.setPassword(password);
        session.setConfig(getProperties());
        session.connect(10 * 1000);

        Channel channel = session.openChannel("shell");
        channel.setOutputStream(log, true);

        try (PipedInputStream commandSource = new PipedInputStream();
             OutputStream commandSink = new PipedOutputStream(commandSource)) {

            CommandSender sender = new CommandSender(commandSink);
            Thread sendThread = new Thread(sender);
            sendThread.start();

            channel.setInputStream(commandSource);
            channel.connect(15 * 1000);

            sendThread.join();
            if (sender.exception != null) {
                throw sender.exception;
            }
        }

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