JSch Esc 命令和编码

JSch Esc commands and encoding

我正在编写一个应用程序以通过 SSH 连接到服务器,打开一个应用程序(运行s 在 shell 上)并使用它。我正在使用 JSch,我已经成功连接、打开应用程序并向它发送命令。现在我面临 2 个问题:

  1. 在 Windows 我遇到了应用程序的编码问题(在 Linux 如果我使用 IDE 控制台输出到 运行 它我有同样的问题,它仅在 bash 上显示正确)。这是一个屏幕截图: 这是它应该显示的屏幕截图:
  2. 我正在 运行ning 的应用程序使用了 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