Nano Hash - криптовалюты, майнинг, программирование

Jsch - Отправка команд через ssh

Проблема: я не могу выйти из бесконечного цикла/блока из буферизованного 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 из: здесь я делаю именно это, когда пытаюсь отправить команды через оболочку.

Проблема:

То, что я пытаюсь сделать, это заставить программу ждать, пока сервер не будет готов к приему дополнительных команд (дождитесь приглашения rkscli, потому что некоторые команды занимают больше времени). Что я могу сделать для этого? В настоящее время я использую метод pipeinput/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(), но будет проходить и пропускать запись (похоже, он ничего не записывает в оболочку, а иногда это будет и непредсказуемо)

Любые идеи относительно того, что я могу сделать?


Ответы:


1

Хорошо, я считаю, что решил проблему, прочитав каждый символ (символ за символом), а не прочитав строку, потому что, поскольку это оболочка, она никогда не даст завершающий (нулевой) символ «/ 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;
                            }

Странная проблема, с которой я столкнулся, когда я написал что-то в оболочку в своем первом вопросе, когда она продолжала читать строку, а не блокировалась, когда я что-то писал в оболочку, заключалась в том, что она читала это и читала строку.

01.08.2013
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..