【问题标题】:Execute multiple ssh commands and get result for each command执行多个 ssh 命令并获取每个命令的结果
【发布时间】:2014-07-09 08:20:04
【问题描述】:

我已经在 Android 上打开了与 jsch 的会话,这样:

SshObjects Connect(String username, String password, String hostname, int port)
    {
        JSch jsch=new JSch();
        try
        {
            sshObjects._session = jsch.getSession(username, hostname, port);
        }
        catch (JSchException e)
        {
            e.printStackTrace();
            return null;
        }
        sshObjects._session.setPassword(password);
        Properties config = new Properties();
        config.put("StrictHostKeyChecking", "no");
        sshObjects._session.setConfig(config);
        try
        {
            sshObjects._session.connect();
        }
        catch (JSchException e)
        {
            e.printStackTrace();
            return null;
        }

        try
        {
            sshObjects._channel = (ChannelExec) sshObjects._session.openChannel("exec");
        }
        catch (JSchException e)
        {
            e.printStackTrace();
            return null;
        }


        connected = true;

        return sshObjects;
}

然后,为了在打开的会话上执行一些命令并获得结果,我这样做了:

private String ExecuteCommand(SshCommandsEnum cmdType)
    {
        String result = "";

        switch (cmdType)
        {
            case SERVER_INFO:
                sshObjects._channel.setCommand("uname --all");
                break;
            .......
        }

        try
        {
            BufferedReader in=new BufferedReader(new InputStreamReader(sshObjects._channel.getInputStream()));
            //sshObjects._channel.disconnect();
            try
            {
                sshObjects._channel.connect();
            }
            catch (JSchException e)
            {
                e.printStackTrace();
            }

            String msg=null;
            try
            {
                while((msg=in.readLine())!=null)
                {
                    System.out.println(msg);
                    result += msg;
                }
                sshObjects._channel.disconnect();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }

        catch (IOException e)
        {
            return "";
        }



        return result;
    }

所以我只想打开一次会话。然后在其上以“exec”的身份执行命令。它适用于连接后执行的第一个命令 - 一切似乎都很好,我可以成功获得结果。但是当我再次调用“执行命令”时,它不再起作用了。我的线程挂在sshObjects._channel.connect(); 上,没有任何效果。当我尝试断开连接(关闭通道和会话)并再次连接时 - 相同。只有在我什至不尝试执行命令的情况下,我才能毫无问题地连接和断开连接。

但是,如果没有这个,我不会遇到这个问题:

BufferedReader in=new BufferedReader(new InputStreamReader(sshObjects._channel.getInputStream()));

但是,显然我需要它来获取我的命令输出。所以有什么问题?你知道我在做什么错吗?

【问题讨论】:

    标签: java android ssh freeze jsch


    【解决方案1】:

    ChannelExec 不可重用,因此您需要为每个命令实例化它。

    【讨论】:

    • 我会试试这个。但是为什么我执行命令后无法断开连接并再次连接?在这种情况下,我不会尝试重用频道。仅关闭会话,关闭(已使用)通道。然后再次连接 - 它挂起。
    • 会话拥有频道。关闭频道,然后使用相同的会话实例创建一个新频道。此外,请考虑使用“shell”通道,因为它允许发送多个命令。
    最近更新 更多