2015-04-30 234 views
0

我正在编写一个应用程序,通过SSH连接到服务器,打开一个应用程序(它在shell上运行)并使用它。我正在使用JSch,并设法连接,打开应用程序并向其发送命令。现在我面临两个问题:JSch Esc命令和编码

  1. 在Windows上我有与应用程序的编码问题(在Linux上,如果我使用IDE控制台输出来运行它,我有同样的问题,那只能说明对上的bash )。这里有一个screehshot: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的不是。

+0

我认为可能存在一个问题,在窗口呈现颜色的可行性 – Augusto

回答

2

至于你的第一个问题,那些是ANSI转义代码。当您创建Jsch shell会话时,默认情况下会分配一个伪终端 - 这会导致发送这些序列。您可以禁用伪终端:

((ChannelShell)channel).setPty(false);

如需更多信息,请参阅this discussion

关于第二个问题,问题是在Windows上,Java的System.in被缓存,并且不允许您轻松地中继转义密钥。您应该能够读取文本行并将它们发送到远程应用程序。对于其他任何事情,您都必须诉诸本地代码才能获得实际的按键。有关如何在不同操作系统上执行此操作的更多详细信息,请参阅this discussion

+0

谢谢。我已经设法解决了第一个问题。我已经决定为我的问题使用另一种方法,因为我的要求是我无法用ssh客户端解决的。我会接受你的回答。 – Augusto