Как я могу прочитать таймаут входящего потока из оболочки библиотеки hierynomus / sshj S SH? - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь написать программу, которая получает доступ к оборудованию с помощью S SH, прослушивает, и когда проходит определенное количество времени (10 секунд) без каких-либо символов, которые могут привести к тайм-ауту из потока чтения. Я просмотрел примеры в Интернете и написал следующий код, но он не работает. Вызов чтения не прерывается по таймауту в 10 секунд. Я делаю что-то неправильно? Есть ли ошибка в библиотеке?

Спасибо за вашу помощь ...

Вот код для клиента:

import java.io.*;

import net.schmizz.sshj.SSHClient;
import net.schmizz.sshj.connection.channel.direct.Session;
import net.schmizz.sshj.connection.channel.direct.SessionChannel;
import java.io.IOException;
import java.net.SocketTimeoutException;
import net.schmizz.sshj.transport.verification.PromiscuousVerifier;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Test implements Runnable {
private static Logger log = LogManager.getLogger(Test.class);

private SSHClient sshClient=null;
private SessionChannel shell = null;
private InputStream inputStream=null;

public static void main(String... args) throws IOException {
    Runnable runnable = new Test();
    Thread thread=new Thread(runnable);
    thread.start();

}

public void run() {
    log.debug("Creating SSHClient");
    sshClient = new SSHClient();

    sshClient.addHostKeyVerifier(new PromiscuousVerifier());

    sshClient.setTimeout(10000);
    try {
        sshClient.connect("localhost", 2224);

        sshClient.authPassword("xxxxxxxx", "xxxxxxxx");

        Session session = sshClient.startSession();
        shell= (SessionChannel) session.startShell();

        inputStream = shell.getInputStream();

        try (BufferedInputStream in = new BufferedInputStream(inputStream)) {

            boolean stayIn = true;
            byte[] buffer = new byte[1024];

            log.debug("Timeout was set to {}",sshClient.getTimeout());
            while (stayIn) {
                int read = 0;

                try {
                    if (log.isDebugEnabled()) {
                        log.debug("Reading/Waiting stream");
                    }
                    read = in.read(buffer);
                    if (read!=-1) {
                        log.debug("Read {} characters", read);
                    }
                    else {
                        log.debug("End of stream", read);
                        break;
                    }
                } catch (SocketTimeoutException e) {
                    if (log.isDebugEnabled()) {
                        log.debug("SocketTimeoutException:, read={}", read);

                    }
                }
            }
        }
    } catch (Exception e) {
        log.error("SSH Could not connect",e);
    }

}

Этот код не истекает.

Что-то пробовал. Я использовал sshClient.getSocket (). SetSoTimeout () и установил для него значение 10000. Когда я читаю из этого входного потока, взятого из sshclient.getSocket (). GetInputStream (), он ДЕЛАЕТ тайм-аут, НО когда Я смотрю на символы, полученные из этого потока, они мусор. Хотя, если я прочитаю входной поток из оболочки или сеанса, он сообщит о правильных символах, НО больше не будет тайм-аута

Кто-нибудь может помочь?

Я просто хочу открыть свой s sh подключения, откройте оболочку, прочтите символы и, когда я не получаю никаких символов для 10000 милли, сообщить об исключении, которое позволит мне узнать, что истекло время ожидания.

Спасибо

...