java - JSch Esc 命令和编码

标签 java linux ssh jsch

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

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

相关文章:

java - 以编程方式验证并签署 Jar

java - 文件类无法使用绝对路径访问文件

linux - 在 Linux Shell 脚本中准备就绪时检测 USB 拇指驱动器

ruby - 通过 Ruby 更改目录

java - 从哪里获取 JSch 连接到 AWS EC2 的用户名/密码?

ssh - ***检测到缓冲区溢出***/usr/bin/expect终止

python - 我如何知道远程进程正在运行或已完成?

java - Solr 查询列表?

c++ - 关于消息队列与共享内存在这种情况下的适用性或适用性

java - ListView 内的 Wicket 表单组件值更改会影响所有元素