【问题标题】:How to send keyboard function keys to SSH server from java code如何从 java 代码向 SSH 服务器发送键盘功能键
【发布时间】:2020-10-23 14:23:14
【问题描述】:

会话连接后,控制台上会显示一个菜单项。并且该菜单项具有 F1、F2、F3 的命令

String host="myhost.abc.123";
String user="devuser";
String password="dev1234";

Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
JSch jsch = new JSch();
Session session = null;
ChannelShell channel = null;

session = jsch.getSession(user, host, 22);
session.setPassword(password);
session.setConfig(config);
session.connect();
System.out.println("Connected");

channel = (ChannelShell) session.openChannel("shell");
OutputStream out_s = channel.getOutputStream();
channel.connect();

我想将 F2 - 功能键作为硬编码的转义序列发送或 从键盘到服务器。 尝试了以下选项,但我没有得到下一个响应/输出

/* --- code for printing the menu item on the console/screen ---
MENU ITEMS GET PRINTED ON THE CONSOLE
F1 - ADD   F2 - UPDATE   F3 - DELETE      
*/

//Try 1. F2 - ESC[OQ 
out_s.write("\033[OQ".getBytes()); // may require \n or \r to enter the cmd
out_s.flush();

//Try 2. F2 - ESC[12~ 
out_s.write("\033[12~".getBytes()); // may require \n or \r to enter the cmd
out_s.flush();

//Try 3. F2 - \E[12~ 
out_s.write("\\E[12~".getBytes());
out_s.flush();

//Try 4. F2 - 0x71 
out_s.write((byte)0x71); // may require \n or \r to enter the cmd
out_s.flush();

//Try 5. F2 - \ESC[OQ
out_s.write("\\ESC[OQ".getBytes());
out_s.flush();

【问题讨论】:

    标签: java ssh ascii jsch outputstream


    【解决方案1】:

    这对我有用:

    out.write("\u001b[12~".getBytes());
    out.flush();
    

    在我测试的服务器上:

    read -n 5 key
    

    这会从标准输入读取 5 个字节,而无需等待返回键。当然,这只是为了测试。您可以在服务器端进行自己的处理。

    如何找出特定键发送的内容(在 bash 中):

    read key
    

    然后键入(例如)F2 键。终端应显示如下内容:

    ^[[12~
    

    如果没有,试试这个命令来显示发送到终端的字节数:

    echo $key | cat -t
    

    在输出中^[ 代表(不可打印的)转义字符。其他角色代表他们自己。

    【讨论】:

    • 我没有锻炼。我试过了。是否与输入流键盘的类型有关。 VT100 什么的。在调试时,我在输入流中获得了属性 ttype=vt100。我们需要任何 \n 或 \r 吗?
    • 我尝试使用 echo $key ......它在屏幕上显示 [[12~。但是如何传入 java inside out.write ?因为“[[12~”.getBytes() 不起作用,还尝试了 \[[12~ 和“\u001b\u001b12~”.getBytes()。更多 ^[[12 也不起作用。
    • 我认为,你的输出必须是'^[[12~',而不是'[[12~'。在这种情况下,我的 Java 代码就可以了。如果它不起作用,我想问题一定出在其他地方。也许在远程终端中运行的程序需要别的东西。在此会话中,您在远程系统上启动了哪个命令?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 2016-11-28
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    相关资源
    最近更新 更多