servlets之我正在寻找一种使用 JSch 创建异步和无状态 ssh 连接的方法
您好,我正在尝试在我的 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 连接一次,将输入和输出流插入其中。使用流来传递命令和捕获输出。
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。