【问题标题】:Telnet client for cisco router思科路由器的 Telnet 客户端
【发布时间】:2012-04-15 02:10:48
【问题描述】:

我正在使用 apache.commons.net.telnet 为 cisco 路由器编写 telnet 客户端。但我有问题。这是代码示例:

static TelnetClient telnetClient = new TelnetClient();

public static void main(String[] args) throws IOException {
    setOptionHandlers();
    telnetClient.connect("192.168.127.100");
    read();
    telnetClient.disconnect();
}

private static void setOptionHandlers() throws IOException {
    ArrayList<TelnetOptionHandler> optionHandlers = 
        new ArrayList<TelnetOptionHandler>();
    optionHandlers.add(new TerminalTypeOptionHandler("VT100", false, false, true, false));
    optionHandlers.add(new EchoOptionHandler(true, false, true, false));
    optionHandlers.add(new SuppressGAOptionHandler(true, true, true, true));
    for (TelnetOptionHandler handler : optionHandlers) {
        try {
            telnetClient.addOptionHandler(handler);
        }
        catch (InvalidTelnetOptionException e) {
            System.err.println("Error registering option handler "
                    + handler.getClass().getSimpleName());
        }
    }
}

public static void write(byte[] data) throws IOException {
    telnetClient.getOutputStream().write(data);
    telnetClient.getOutputStream().flush();
}

public static void read() throws IOException {
    System.out.println("Read");
    byte[] buff = new byte[1024];
    int read;
    if((read = telnetClient.getInputStream().read(buff)) > 0) {
        System.out.println(new String(buff, 0, read));
    }
    System.out.println("read="+read);
}

在某些情况下,它可以正常工作并提示输入密码。但是在其他情况下它工作不正确 - 通过从 telnet 输入流中读取而挂起。运行条件相同。为什么我会遇到这种情况? 如果有人有编写 cisco telnet 客户端的技巧,我会很高兴听到他们!

【问题讨论】:

  • 使用tcpdump 或其他数据包嗅探器找出原因。从这一层代码无法判断。
  • 你能更准确地描述这个问题吗?你是说你没有输出吗?或者你得到一些输出然后它挂起?还是什么?
  • 我尝试过使用wireshark。它显示,我的路由器发送 telnet 数据(提示输入密码),但我的应用程序不响应此数据包。收到三重提示后(如果发生超时错误,则会发送新提示),我的应用程序会打印所有 3 个提示,然后是密码错误错误。我不明白什么时候会发生。可能是 telnet 选项中的情况?
  • read 函数 ever 是否返回,但您再次调用它并阻塞?还是它永远不会返回一次?
  • 某些情况下read函数是否立即返回,并显示一个提示。在其他情况下,此函数会挂起一段时间(我认为是三重密码超时)然后返回,并显示 3 个提示,每个提示都有“超时”消息和密码错误错误。

标签: client apache-commons telnet cisco


【解决方案1】:

我每次都能重现这个问题。

可以通过将读取缓冲区大小更改为 1 字节来解决此问题。

这解释了为什么 Looking for Java Telnet emulator 中的 readUntil() 函数可以工作,它只是调用 read() 1 个字节。

也就是说,这是否表明 org.apache.commons.net.telnet.TelnetClient 中存在错误?

编辑:回滚到较早版本的 Commons Net,问题就消失了!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-05
    • 2018-02-05
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 2016-01-09
    相关资源
    最近更新 更多