Мне нужно имитировать нажатия клавиш в безголовой среде.
Все xte
, xdotool
и много C++
предназначен для работы с окном X11
Я пробовал xdotool, и он выдает ошибку:
xdotool type "aaaaa"
Error: Can't open display: (null)
Failed creating new xdo instance
Я знаю о Xvfb
но ищу другое возможное решение
Чтобы приложение получало какие-либо нажатия клавиш, оно должно получать их откуда-то. Обычно есть только два варианта: через окно или через TTY. Как имитировать нажатие клавиши, зависит от того, какой из двух случаев.
Через окно
Если приложение получает нажатия клавиш через окно, чтобы имитировать их xdotool
это правильный инструмент для работы. Вам просто нужно установить правильный DISPLAY
переменная, такая что xdotool
подключиться к тому же X-серверу, что и приложение.
Через виртуальный телетайп
Многие программы будут вызывать оболочку в виртуальном TTY. xterm
, sshd
, script
, screen
вот несколько типичных примеров. Программа, создавшая виртуальный телетайп, может отправлять любые нажатия клавиш на телетайп, записывая данные на управляющем конце виртуального телетайпа.
Если бы это было xterm
или любой аналогичный эмулятор терминала, способ имитации нажатия клавиши - это сделать это через окно, как описано выше.
Из остального списка единственная известная мне программа с функцией имитации нажатия клавиш - это screen
. Вы можете отправлять нажатия клавиш в любое именованное окно в пределах screen
такой сеанс (реальный пример, который я часто использую):
screen -X at alsamixer stuff 2
Вот screen -X
подключится к работающему экрану и вызовет команду. at alsamixer
вызовет остальную часть команды в окне с именем alsamixer
. stuff 2
будет имитировать нажатие 2.
Следует отметить одно предостережение: вышеперечисленное работает, только если screen
сеанс в настоящее время прикреплен откуда-то. Я не знаю, как заставить его работать на отдельном screen
.
Через аппаратный TTY
Вы можете настроить аппаратную отправку фактических нажатий клавиш. Если это последовательная линия, вы можете отправлять нажатия клавиш, записывая их в последовательный порт компьютера на другом конце линии. Если это локальная консоль, у вас может быть какое-то оборудование, подключенное как настоящая клавиатура (я уверен, что можно найти USB-устройства, которые могут это сделать).
В случае Linux существуют драйверы, которые могут имитировать нажатия клавиш на локальной консоли, как если бы они исходили от реального оборудования.