使用JSch

问题描述 投票:0回答:1
我遇到的问题是:

当我发送第二个命令时,我将无法像工作目录那样保留外壳状态。如何保留以前的状态?我尝试使用同一会话,但行不通。

public String sendCommand(String command) { StringBuilder outputBuffer = new StringBuilder(); try { Channel channel = sesConnection.openChannel("exec"); ((ChannelExec) channel).setCommand(command); InputStream commandOutput = channel.getInputStream(); channel.connect(); int readByte = commandOutput.read(); while (readByte != 0xffffffff) { outputBuffer.append((char) readByte); readByte = commandOutput.read(); } channel.disconnect(); } catch (IOException ioX) { logWarning(ioX.getMessage()); return null; } catch (JSchException jschX) { logWarning(jschX.getMessage()); return null; } return outputBuffer.toString(); } Image

在我拥有的控制器中,将其发送回Websocket:

private SSHManager getSSHInstance() { String errorMessage = null; if (sshInstance == null) { sshInstance = new SSHManager(username, password, host, "", port); errorMessage = sshInstance.connect(); System.out.println("Instance created"); if (errorMessage != null) { throw new RuntimeException("Could not create an ssh connection"); } } System.out.println("Returning created instance"); return sshInstance; } @MessageMapping("/user") @SendTo("/topic/user") public UserResponse getResponse(String command) { SSHManager currInstance = getSSHInstance(); String result = currInstance.sendCommand(command); return new UserResponse(result); }
  1. I尝试使用“ shell”通道而不是“ exec”,该通道用于通过标准输入和输出流来获取输入和输出,但我无法从/返回到Websocket和UI的实时输入和输出。我不确定如何从这里进行。关于/外观的任何方向都会非常有帮助。
    我是我通过标准输入/输出流的SSH终端的代码:

    import com.jcraft.jsch.*; public class Terminal{ public static void main(String[] args){ try{ JSch jsch=new JSch(); String host = "127.0.0.1"; String user = "user"; String password = "pass"; Session session=jsch.getSession(user, host, 5679); session.setPassword(password); session.setConfig("StrictHostKeyChecking", "no"); session.connect(10000); Channel channel=session.openChannel("shell"); channel.setInputStream(System.in); channel.setOutputStream(System.out); channel.connect(3*1000); } catch(Exception e){ System.out.println(e.getMessage()); } } }

    要从UI发送命令,我有以下内容:
  2. function sendCommand() { if (stompClient != null) { stompClient.send("/app/user", {}, JSON.stringify({'command': $("#command").val()})); } }
  3. 如果您想实现交互式外壳,则必须使用“ shell”通道,而不是“ exec”通道。 “ Exec”频道用于自动化单个命令。
    
    一些参考:

    jsch
中的“ shell”频道和“ exec”频道之间的区别是什么
java ssh jsch spring-websocket java-websocket
1个回答
2
投票
jsch

Shell.java

示例

© www.soinside.com 2019 - 2025. All rights reserved.