java - 如何从 java 代码向 SSH 服务器发送键盘功能键
问题描述
会话连接后,控制台上会显示一个菜单项。并且该菜单项具有 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();
解决方案
这对我有用:
out.write("\u001b[12~".getBytes());
out.flush();
在我测试的服务器上:
read -n 5 key
这会从标准输入读取 5 个字节,而无需等待返回键。当然,这只是为了测试。您可以在服务器端进行自己的处理。
如何找出特定密钥发送的内容(在 bash 中):
read key
然后键入(例如)F2 键。终端应显示如下内容:
^[[12~
如果没有,请尝试使用此命令显示发送到终端的字节:
echo $key | cat -t
在输出^[
中代表(不可打印的)转义字符。其他角色代表他们自己。
推荐阅读
- iframe - 我无法使用启动画面呈现此网页
- c# - 按列分组并使用 Linq 获取组的第一条记录
- java - com.jcraft.jsch.jschexception 连接被外部主机关闭
- python - Python BeautifulSoup 无法使用 JS 从页面中提取标题
- google-play - Google Play 开发者帐户付款不起作用
- javascript - 我需要 javascript 中的序列方面的帮助
- json - aws预签名上传URL返回json?
- java - 为 Web 推送通知使用异步 Servlet
- angular - Prime-NG 文件上传器从上传队列中取消图像并将其从阵列中删除
- c# - EF6 数据库优先:违反多重性约束。关系“...”的角色“...”具有多重性 1 或 0..1