有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java执行多个ssh命令并获取每个命令的结果

我已经在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()));

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


共 (1) 个答案

  1. # 1 楼答案

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