我正在寻找一种方法来创建异步&使用JSch的无状态ssh连接?

时间:2014-07-14 12:11:22

标签: servlets jsch

您好我正在尝试在我的网络应用程序中创建一个类似于putty的界面。 1.它将有一个文本框来输入命令(暂时硬编码服务器用户凭证),如果用户点击返回键,它将向服务器发送ajax请求。 2.服务器将创建jsch& session和channle对象,并在远程shell中执行该用户命令。 3.我将在用户浏览器屏幕中填充响应。 我不希望上面的第二点用于进一步的请求。我希望它为“服务器将检查现有频道并使用该频道将执行”。 为了实现这一点,我尝试将通道对象存储在会话中。但是我需要在每个请求上执行通道对象的.connect()方法(返回上次登录时间......,似乎是使用旧证书进行登录过程),即只有状态是按用户存储的名字和密码而不是连接和服务器会话。     有人可以建议我用JSch解决我的问题的方法。 或建议我任何其他方式来实现我的要求。 (像浏览器窗口中的界面一样)

即,我正在寻找一种方法来创建异步&使用JSch的无状态ssh连接?

这是我的代码

protected void doPost(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    String createSession = request.getParameter("createSession");
    String logOff = request.getParameter("logOff");
    userVoice = request.getParameter("string");
    userVoice = userVoice == null ? "" : userVoice;
    userVoice = userVoice + "\n";
    writer = response.getWriter();
    try {
        HttpSession httpSession = request.getSession();
        //channel = (Channel) httpSession.getAttribute("channel");
        if(channel!= null && channel.isConnected())
        {
            /*
             * channelOutput = (InputStream) httpSession
             * .getAttribute("channelOutput"); channelInput = (OutputStream)
             * httpSession .getAttribute("channelInput");
             */
            channelOutput = channel.getInputStream();
            channelInput = channel.getOutputStream();

        }

        if (createSession != null && logOff == null) {
            String username = request.getParameter("username"); // "bninet";
            String password = request.getParameter("password"); // "password";
            String host = request.getParameter("host"); // "10.77.246.120";
                                                        // // sample ip
                                                        // address
            int port = Integer.parseInt(request.getParameter("port"));
            JSch jsch = new JSch();
            Session session = jsch.getSession(username, host, port);
            session.setPassword(password);
            Properties properties = new Properties();
            properties.put("StrictHostKeyChecking", "no");
            session.setConfig(properties);
            session.setPassword(password);
            session.connect(30000);
            channel = session.openChannel("shell");
            setIOforChannel(channel, httpSession);
        //  httpSession.setAttribute("channel", channel);
        } else if (channelOutput != null && channelInput != null) {
            if (logOff != null) {
                userVoice = "exit";
            }
            channelInput.write((userVoice + "\n").getBytes());
            //channel.connect();

            if (logOff != null) {
                channel.disconnect();
            //  httpSession.removeAttribute("channelOutput");
            //  httpSession.removeAttribute("channelInput");
            }
        } else {
            writer.write("No session Available.\n Please create a session using createSession tool ");
            return;
        }
        Thread.sleep(1000);
        String returnData = streamToString(channelOutput);
        int i = 0;
        while (!returnData.isEmpty() && i < 5) {
            writer.write(returnData);
            Thread.sleep(1000);
            returnData = streamToString(channelOutput);
            i++;
        }

    } catch (Exception e) {
        writer.write("Error Occured --  " + e.getMessage());
    } finally {
        writer.flush();
        writer.close();

    }

}

1 个答案:

答案 0 :(得分:1)

如果您重复使用频道,它会重新使用会话,该会话会保存您的凭据。

要使用不同的凭据,您需要断开会话,更改其设置并重新连接。

How to disconnect the session.

如果您想重复使用会话,则不需要每次都重新协调通道。将其作为shell连接一次,将输入和输出流插入其中。使用流来传递命令并捕获输出。

See the JSCH example on the JCraft website.