Я должен моделировать нажатия клавиш в бездисплейной среде.
Все 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
Многие программы будут вызывать оболочку внутри виртуальной TTY. xterm
, sshd
, script
, screen
- вот несколько типичных примеров. Программа, создавшая виртуальную TTY, может посылать на TTY любые нажатия клавиш, записывая их на управляющем конце виртуальной TTY.
Если бы это был xterm
или любой аналогичный эмулятор терминала, то симулировать нажатие клавиш можно было бы через окно, как описано выше.
Из остального списка, единственная программа, которую я знаю, с возможностью симулировать нажатия клавиш - это screen
. Вы можете посылать нажатия клавиш в любое названное окно в рамках подобного сеанса screen
(реальный пример, который я часто использую):
screen -X at alsamixer stuff 2
Здесь screen -X
подключится к работающему экрану и вызовет команду. в alsamixer
вызовет оставшуюся часть команды в окне с именем alsamixer
. вещи 2
будут имитировать нажатие 2 .
Одно из предостережений, чтобы заметить, что вышесказанное работает только в том случае, если сеанс экрана
в данный момент откуда-то прикреплен. Я не знаю, как заставить его работать на отдельном экране
.
Через аппаратное TTY
можно заставить аппаратное обеспечение посылать действительные нажатия клавиш. Если это последовательная линия, вы можете посылать нажатия клавиш, записывая их на последовательный порт компьютера на другом конце линии. Если это локальная консоль, то в качестве настоящей клавиатуры можно использовать аппаратное обеспечение (я уверен, что можно найти USB-устройства, которые могут это сделать.)
В случае с Linux, существуют драйверы, которые могут имитировать нажатия клавиш на локальной консоли так же, как если бы они исходили от фактического аппаратного обеспечения.
.