使用 Jsch 和 Java 将 System.out 复制到文件

Copy System.out to a File using Jsch and Java

我将 JSCH 与 Shell 到 运行 多个命令一起用于主机。一切正常,但我的问题是如何获得 System.out 并将其保存到文件中。我正在寻找复制而不是重定向。我可以做其中之一,但不能两者都做。

try (OutputStream logOutput = new BufferedOutputStream(new FileOutputStream(outputFilePath))) {
            try (InputStream login = new BufferedInputStream(new FileInputStream(outputFilePath))) {

     JSch jsch = new JSch();
     Session session = jsch.getSession(user, host, 22);
     session.setPassword(password);
     session.setConfig(getProperties());
     session.connect(10 * 1000);
     Channel channel = session.openChannel("shell");
     //channel.setOutputStream(System.out);// I want to activate it as well as the following command
    channel.setOutputStream(logOutPut, true);// I am writing it to file
     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();

您可以创建 FilterOutputStream 的子类,将相同的字节写入多个 OutputStreams:

public class MultiplexOutputStream
extends FilterOutputStream {
    private final OutputStream[] streams;

    public MultiplexOutputStream(OutputStream stream,
                                 OutputStream... otherStreams) {
        super(stream);
        this.streams = otherStreams.clone();

        for (OutputStream otherStream : otherStreams) {
            Objects.requireNonNull(otherStream,
                "Null OutputStream not permitted");
        }
    }

    @Override
    public void write(int b)
    throws IOException {
        super.write(b);
        for (OutputStream stream : streams) {
            stream.write(b);
        }
    }

    @Override
    public void write(byte[] bytes)
    throws IOException {
        super.write(bytes);
        for (OutputStream stream : streams) {
            stream.write(bytes);
        }
    }

    @Override
    public void write(byte[] bytes,
                      int offset,
                      int length)
    throws IOException {
        super.write(bytes, offset, length);
        for (OutputStream stream : streams) {
            stream.write(bytes, offset, length);
        }
    }

    @Override
    public void flush()
    throws IOException {
        super.flush();
        for (OutputStream stream : streams) {
            stream.flush();
        }
    }

    @Override
    public void close()
    throws IOException {
        super.close();
        for (OutputStream stream : streams) {
            stream.close();
        }
    }
}

要在您的代码中使用它:

channel.setOutputStream(new MultiplexOutputStream(logOutput, System.out), true);