Как отправить функциональные клавиши клавиатуры на SSH-сервер из кода Java

#java #ssh #ascii #jsch #outputstream

#java #ssh #ascii #jsch #outputstream

Вопрос:

Существует пункт меню, который отображается на консоли после подключения сеанса. И в этих пунктах меню есть команда с 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 в виде жестко запрограммированной escape-последовательности или
с клавиатуры на сервер.
Попробовал следующие варианты, но я не получаю следующий ответ / вывод

 /* --- 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("33[OQ".getBytes()); // may require n or r to enter the cmd
out_s.flush();

//Try 2. F2 - ESC[12~ 
out_s.write("33[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();
  

Ответ №1:

Это сработало для меня:

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

На сервере, который я тестировал с помощью:

 read -n 5 key
  

Это считывает 5 байт из стандартного ввода, не дожидаясь возврата ключа. Конечно, это только для тестирования. Вы можете выполнить свою собственную обработку на стороне сервера.

Как узнать, что отправляется определенным ключом (в bash):

 read key
  

Затем введите (например) клавишу F2. Терминал должен показывать что-то вроде этого:

 ^[[12~
  

Если нет, попробуйте выполнить эту команду, чтобы отобразить байты, отправленные на терминал:

 echo $key | cat -t
  

В выходных ^[ данных используется (непечатаемый) escape-символ. Остальные символы стоят сами за себя.

Комментарии:

1. У меня не получилось. Я пробовал. Связано ли это с типом клавиатуры потока ввода. VT100 ot что-то. Во время отладки я получаю во входном потоке свойство ttype= vt100. Требуется ли нам какой-либо n или r ?

2. Я попытался использовать echo $ key …… На экране отображается [[12 ~. Но как передать Java наизнанку. написать? Потому что «[[12 ~».getBytes() не работает, а также попробовал [[12 ~ и «u001b u001b12 ~».getBytes(). Подробнее ^ [[12 также не работает.

3. Я думаю, ваш вывод должен быть ‘^ [[12 ~’, а не ‘[[12 ~’. В этом случае мой Java-код будет в порядке. Если он не работает, я полагаю, проблема должна быть в другом месте. Возможно, программа, запущенная в удаленном терминале, ожидает чего-то другого. Какую команду вы запустили в удаленной системе в этом сеансе?