您好我正在尝试在我的网络应用程序中创建一个类似于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();
}
}
答案 0 :(得分:1)
如果您重复使用频道,它会重新使用会话,该会话会保存您的凭据。
要使用不同的凭据,您需要断开会话,更改其设置并重新连接。
How to disconnect the session.
如果您想重复使用会话,则不需要每次都重新协调通道。将其作为shell连接一次,将输入和输出流插入其中。使用流来传递命令并捕获输出。