我正在编写一个应用程序,通过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会话时,默认情况下会分配一个伪终端,这会导致发送这些序列。您可以禁用伪终端:((ChannelShell)channel).setPty(false);
有关更多信息,请参见this discussion。
关于您的第二个问题,问题是在Windows上Java的System.in
是缓冲的,不允许您轻松地中继转义密钥。您应该能够读取文本行并将它们发送到远程应用程序。更重要的是,您必须使用本机代码来获得实际的按键。有关如何在不同操作系统上执行此操作的详细信息,请参见this discussion。
关于java - JSch Esc命令和编码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29971908/