使用 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);
我将 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);