【问题标题】:Jsch - Sending commands via sshJsch - 通过 ssh 发送命令
【发布时间】:2013-08-01 20:08:26
【问题描述】:

问题:我似乎无法从缓冲的 reader.readline() 中摆脱“无限循环/块”。它通过它一次,然后在第二次从 while 循环中出现后就挂在那里。

这是我的代码:

public void sendCommand(String command){
        {
            String line;
             try{
                 while((line = consoleOutput.readLine())!= null)
                    {
                         System.out.println(line);
                         if(line.equals("rkscli:") || line.equals("password :") || line.equals("Please login: ")){
                             pin.write((command + "\n\r").getBytes());
                         }
                    }
                 }

我正在使用 nilbot 使用的方法来自:Here 我正在这样做,我试图通过 shell 发送命令。

问题:

我想要完成的是让程序等到服务器准备好接收更多命令(等待提示符“rkscli”,因为某些命令需要更多时间)。我该怎么做才能做到这一点?我目前正在使用管道输入/输出方法。

其他信息:

服务器会在提示之前给我“”(带有换行符的空字符串)。在其中一些之后,它会给我提示。我还注意到,如果我将代码更改为如下所示:

public void sendCommand(String command){
    {
        String line;
         try{
             while((line = consoleOutput.readLine())!= null)
                {
                     System.out.println(line);
                                     pin.write("\r\n".getBytes());//Added line
                     if(line.equals("rkscli:") || line.equals("password :") || line.equals("Please login: ")){
                         pin.write((command + "\n\r").getBytes());
                     }
                }
             }

它不会在 bufferedReader.readline() 处挂起,但会通过并跳过写入(它似乎没有向 shell 写入任何内容,有时它会且不可预测)

关于我能做什么的任何想法?

【问题讨论】:

    标签: java ssh infinite-loop freeze jsch


    【解决方案1】:

    好的,我相信我通过读取每个字符(逐个字符)而不是读取行来解决问题,因为由于它是一个 shell,它永远不会给出终止(空)字符“/00”,如果我是没有弄错 read 行会寻找它并将继续等待,直到找到它因此阻塞而不继续。

    这是修改后的代码:

     line = new StringBuilder();
                     boolean ready = false;
                     int c = 0;
                            Thread.sleep(1000);//needs to sleep, it isnt ready :(
                            while((ready = consoleOutput.ready()) == true){
                                ready = consoleOutput.ready();
                                c = consoleOutput.read();//read char by char
                                line.append((char)c);
                                if((char)c == ':' && (c=consoleOutput.read()) == 0x20 && (consoleOutput.ready()!= true)){
                                    pin.write((command + "\n\r").getBytes());//writing after ready
                                    pin.flush();
                                    System.out.println(line.toString() + command);
                                    line = null;
                                    break;
                                }
    

    当我在第一个问题中向 shell 写入内容时遇到的奇怪问题是,当我向 shell 写入任何内容时它会继续读取 line 而不会阻塞,因为它正在读取该内容并读取 line。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-04
      • 2016-12-21
      • 2011-01-25
      • 2016-09-17
      • 2011-05-10
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多