首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用jsch时的缓冲区问题

使用jsch时的缓冲区问题
EN

Stack Overflow用户
提问于 2014-10-30 10:15:18
回答 1查看 1.1K关注 0票数 0

我目前在实现jsch库以从ZyXel交换机获取信息时遇到了一个问题。程序本身将获取一些信息以确认交换机的类型,然后上载正确的固件和配置。

我的问题,对我来说,似乎是缓冲问题。我发送命令没有问题,但当我发送它时,取决于我何时运行它或多长时间一次,我要么得到我应该获得的信息的一半,要么得到所有信息。我认为这是因为有时缓冲区不会一直清空到ByteArrayInputStream中,但在这一点上我感到迷茫。我想知道有没有人能给我指出正确的方向,看看我错了什么。我假设这是一个基本的InputStream或jsch文档问题

谢谢!下面是..my代码。

代码语言:javascript
复制
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;
}

}
EN

回答 1

Stack Overflow用户

发布于 2014-12-25 02:42:38

我正在做类似的项目,现在我创建了全局输出流,它不需要等待任何东西。我重写了OutputStream以使用JTextArea作为输出

代码语言:javascript
复制
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();
    }

}
}

因此,要在创建通道的部分中使用此输出流,请设置以下内容:

代码语言:javascript
复制
channel.setOutputStream(new AreaOutputStream(TEXT_AREA_NAME))

因此,您可以创建另一个通道来执行命令,并将这个类设置为输出-所有这些都将出现在JTextArea中。

顺便说一下,我现在尝试创建在一个通道中发送命令的InputStream (对于联系人,请将'domain.name‘替换为'mail.ru')

希望这能对我的英语水平有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26643932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档