我正在编写一个应用程序以通过 SSH 连接到服务器,打开一个应用程序(它在 shell 上运行)并使用它。我正在使用 JSch,我已经成功连接、打开应用程序并向它发送命令。现在我面临两个问题:
- 在 Windows 上,我遇到了应用程序的编码问题(在 Linux 上,如果我使用 IDE 控制台输出来运行它,我会遇到同样的问题,它只在 bash 上正确显示)。这是一个截图:这是它应该显示的屏幕截图:
我正在运行的应用程序使用了 ESC 键,但我无法在我编写的应用程序中使用它。它只是在输出中写入
^[
下面是我用来执行此应用程序的代码:JSch shell = new JSch(); Session session = shell.getSession("myUser", "myHost"); session.setPassword("myPassword"); session.setConfig("StrictHostKeyChecking", "no"); session.connect(); Channel channel = session.openChannel("shell"); channel.setOutputStream(System.out); PipedInputStream in = new PipedInputStream(); PipedOutputStream out = new PipedOutputStream(in); channel.setInputStream(in); channel.connect(); out.write("my_application\n".getBytes()); Thread.sleep(1000); //waiting for the app to load out.write("\n".getBytes()); out.write("appUser\n".getBytes()); out.write("appPassword\n".getBytes()); channel.setInputStream(System.in);
PS:服务器使用 sh 而不是 bash。
最佳答案
关于您的第一个问题,这些是 ANSI 转义码。当您创建 Jsch shell session 时,默认情况下将分配一个伪终端 - 这会导致发送这些序列。您可以禁用伪终端:
((ChannelShell)channel).setPty(false);
有关更多信息,请参阅 this discussion .
关于你的第二个问题,问题是在 Windows 上 Java 的 System.in
是缓冲的,并且不允许你轻松地中继转义键。您应该能够读取文本行并将它们发送到远程应用程序。除此之外,您将不得不求助于 native 代码来获得实际的按键操作。参见 this discussion有关如何在不同操作系统上执行此操作的更多详细信息。
关于java - JSch Esc 命令和编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29971908/