【问题标题】:Ganymed ssh2 : how to solve (y/n) prompt in command lineGanymed ssh2:如何在命令行中解决(y/n)提示
【发布时间】:2016-09-02 14:48:32
【问题描述】:

我正在使用 Ganymede ssh2 从我的 Java 应用程序连接到服务器并在那里做一些工作。
它运行良好,但问题是请求批准的 ssh 命令,例如。 一个命令

stop someService

返回

Are you sure (y/n)?

在适当的击键 (y/n) 之后,它会继续前进。

目前我正在使用 ssh2 ganymed 示例给出的实现,就像这样:

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')调用这个util类后,它卡在了

String line = br.readLine();

服务器超时后一切都会中断。

非常欢迎任何有关如何解决此问题的想法。

非常感谢, 米洛斯。

【问题讨论】:

    标签: java ssh


    【解决方案1】:

    假设Session 有一个getStdin() 方法,您应该将问题的回复写到那个。

    或者找出要求输入的命令是否具有不会提示的“非交互”模式。

    【讨论】:

    • 不幸的是,此命令没有不提示的模式。但是,“Session”对象中有一个“getStdin()”。我尝试使用它,但不知道如何使用它。这是我添加的代码:' Session sess = conn.openSession(); sess.execCommand(命令); sess.getStdin().write("pwd".getBytes()); InputStream stdout = new StreamGobbler(sess.getStdout()); BufferedReader br = new BufferedReader(new InputStreamReader(stdout));'有什么问题不知道怎么回事?!
    • 对不起,我添加的代码是:Session sess = conn.openSession(); sess.execCommand(command); sess.getStdin().write("y".getBytes()); InputStream stdout = new StreamGobbler(sess.getStdout()); BufferedReader br = new BufferedReader(new InputStreamReader(stdout));
    • 将标准输入流包装在一个写入器中,然后写入“y\n”,以便它发送回车
    • 非常感谢!用回车“\n”发送“y”就可以了!
    【解决方案2】:

    如果您要使用 stdin 而不是 exec,那么您必须先执行 session.startShell()。阅读常见问题解答。

    【讨论】:

      【解决方案3】:

      我用这个代码...

      sess.executeCommand("ena"+'\n' +"pass"+'\n' +"exit"+'\n');
      

      【讨论】:

        猜你喜欢
        • 2019-06-15
        • 2013-01-09
        • 2021-11-10
        • 1970-01-01
        • 2018-03-08
        • 2020-07-25
        • 2018-01-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多