servlets之我正在寻找一种使用 JSch 创建异步和无状态 ssh 连接的方法

JustinYoung 阅读:45 2024-02-27 23:08:18 评论:0

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

即,我正在寻找一种使用 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(); 
 
    } 
 
} 

请您参考如下方法:

如果您重用一个 channel ,它会重用保存您的凭据的 session 。

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

How to disconnect the session.

如果你想重用 session ,你不需要每次都重新连接 channel 。将它作为 shell 连接一次,将输入和输出流插入其中。使用流来传递命令和捕获输出。

See the JSCH example on the JCraft website.


标签:Servlet
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号