有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Jsch通过ssh发送命令

问题是:我似乎无法从缓冲读取器中摆脱“无限循环/块”。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”,因为某些命令需要更多时间)。我能做些什么来实现这一点?我目前正在使用pipedinput/output方法

其他资料:

服务器将在提示之前给我“”的(带换行符的空字符串)。几次之后,它会给我提示。我还注意到,如果我更改代码,使其看起来像这样:

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写入任何内容,有时会,而且不可预测)

关于我能做什么有什么想法吗


共 (1) 个答案

  1. # 1 楼答案

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

    修订后的守则如下:

     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写东西时,它会继续读行而不是阻塞,我遇到了一个奇怪的问题,这是因为它在读行而不是阻塞