Ganymed ssh2: как решить (y / n) подсказку в командной строке - PullRequest
1 голос
/ 16 марта 2012

Я использую Ganymede ssh2 для подключения к серверу из моего приложения Java и выполняю там некоторую работу.
Это работает отлично, но проблемы с командами ssh, которые запрашивают утверждение, например. команда

stop someService

возвращает

Are you sure (y/n)?

и после соответствующего нажатия клавиши (y / n) он продолжает движение.

В настоящее время я использую реализацию, представленную ssh2 ganymed example, что-то вроде этого:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;

public class ConnectUtil(String hostname, String username, String password, String command)
{

    try
    {
        Connection conn = new Connection(hostname);
        conn.connect();

        boolean isAuthenticated = conn.authenticateWithPassword(username, password);

        if (isAuthenticated == false)
            throw new IOException("Authentication failed.");

        Session sess = conn.openSession();

        sess.execCommand(command);

        InputStream stdout = new StreamGobbler(sess.getStdout());

        BufferedReader br = new BufferedReader(new InputStreamReader(stdout));

        while (true)
        {
            String line = br.readLine();
            if (line == null)
                break;
            System.out.println(line);
        }
        sess.close();
        conn.close();
    }
    catch (IOException e)
    {
        e.printStackTrace(System.err);
    }       
}

После вызова этого класса утилит с помощью вышеупомянутой команды ('stop someService') он застревает на

String line = br.readLine();

и все перестает работать после истечения времени ожидания сервера.

Любые идеи о том, как решить эту проблему, приветствуются.

Большое спасибо, Милош.

Ответы [ 3 ]

1 голос
/ 16 марта 2012

Предполагая, что Session имеет метод getStdin(), вы должны записать ответ на вопрос на этот вопрос.

Либо то, либо выясните, имеет ли команда, которая требует ввода, режим «неинтерактивный»это не подскажет.

0 голосов
/ 01 сентября 2016

Я использую этот код ...

sess.executeCommand("ena"+'\n' +"pass"+'\n' +"exit"+'\n');
0 голосов
/ 11 октября 2012

Если вы собираетесь использовать stdin вместо exec, то сначала вам нужно выполнить session.startShell (). Прочитайте часто задаваемые вопросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...