我目前在实现jsch库以从ZyXel交换机获取信息时遇到问题。程序本身将获取一些信息以确认交换机的类型,然后上传正确的固件和配置。
对我来说,我的问题似乎是一个缓冲问题。我发送命令没有问题,但是当我发送它时,取决于我何时运行它或者多久,我要么获得一半的信息,要么获得所有信息。我认为这是因为有时缓冲区不会一直空到ByteArrayInputStream中,但此时我处于迷失状态。我想知道是否有人可以指出我正确的方向我错了。我认为这是一个基本的InputStream或jsch文档问题误解
谢谢!我的代码在下面。
package ssh;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import com.jcraft.jsch.*;
public class ssh {
private static String user = "admin";
private static String host = "192.168.1.1";
private static String password = "1234";
private static String command = "";
public static void startAutomation() {
JSch jsch = new JSch();
Session session = null;
OutputStream output = null;
Channel channel = null;
try {
session = jsch.getSession(user,host,22);
session.setPassword(password);
session.setConfig("StrictHostKeyChecking","no");
session.connect();
channel = session.openChannel("shell");
command = "show system-information\n";
output = runCommand(command, session, channel);
String test = "NOTHING";
if (output.toString().contains("ES-2024A")) {
test = "true";
command = "show run\n";
output = runCommand(command,session,channel);
} else {
test = "false";
}
System.out.println(test + " This is a 2024A");
} catch (JSchException | InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
channel.disconnect();
session.disconnect();
}
}
public static OutputStream runCommand(String c,Session session,Channel channel) throws InterruptedException, JSchException{
InputStream is = new ByteArrayInputStream(c.getBytes());
channel.setInputStream(is);
OutputStream outputInfo = new ByteArrayOutputStream();
channel.setOutputStream(outputInfo);
channel.connect(15*1000);
try {
is.close();
outputInfo.flush();
outputInfo.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return outputInfo;
}
}
答案 0 :(得分:0)
我正在开展类似的项目,现在我创建了全局输出流,不需要等待任何东西。 我重写了OutputStream以使用JTextArea作为输出
private java.util.List<Character> buffer = new ArrayList<Character>();
public class AreaOutputStream extends OutputStream {
private JTextArea textArea;
public AreaOutputStream(JTextArea textArea) {
this.textArea = textArea;
}
@Override
public synchronized void write(int b) throws IOException {
// collect all character into the buffer
buffer.add((char)
// on '\n' character append to output window
if (String.valueOf((char) b).equals("\n")) {
StringBuilder sb = new StringBuilder(buffer.size());
for (Character c : buffer) sb.append(c);
String line = sb.toString();
// filter output from special characters
//and replace invitation '[username@server~]$ ' with current time
line = line.replaceAll(" \r", "");
line = line.replaceAll("\r", "");
line = line.replaceAll(String.valueOf(Pattern.compile("\\[[0-9][^m ]*m")), "");
line = line.replaceAll(String.valueOf(Pattern.compile("\\[.*@[^$]*\\$ ")), DateFormat.getTimeInstance().format(java.lang.System.currentTimeMillis()) + " ");
line = line.replaceAll(String.valueOf(Pattern.compile("\u001B")), "");
if (!line.matches("(.*)Last login(.*)from(.*)\n")) {
textArea.append(line);
textArea.setCaretPosition(textArea.getDocument().getLength());
}
buffer.clear();
}
}
}
因此,要在您创建频道的部分中使用此输出流,请执行以下操作:
channel.setOutputStream(new AreaOutputStream(TEXT_AREA_NAME))
因此,您可以创建另一个通道来执行命令并将此类设置为输出 - 所有这些都将显示在JTextArea中。
BTW现在我尝试创建InputStream以在一个频道中发送命令(联系方式请将'domain.name'替换为'mail.ru')
希望这对我的英语有所帮助和抱歉。