Linux скрипт нажатия клавиш

bash скрипт

Можно ли как то при помощи bash скрипта отследить нажатие клавиш
Ctrl+Shift ? Что бы можно было запустить скрипт в фоне и при нажатии на Ctrl+Shift на консоль выводилось сообщение.

Тоже интересует, но скорее всего — нельзя

В консоли — нет. Так как скрипт по условиям задачи работает на фоне, он не обрабатывает stdin (стандартный ввод, клавиатуру), а значит никак не може реагировать на нажатие клавиш. Уверен что на c++ такое сделать можно с помощью перехватов каких-то вызовов.

Телепатирую что ты все равно работаешь в иксах. Значит перехватить комбинацию клавишь — легче. Что касается вывода на экран сообщения — можно сделать так:

Этот скрипт выведет сообщение в любую консоль пользователя kroz и неважно это иксы или нет (искользовал чтобы syslog-ng выводил сообщения о критических ошибках).

Теперь о перехвате комбинации клавиш.

В KDE еще проще — в System Settings есть Shortcusts And Gestures в котором Custom Shortcuts где ты можещь добавить выполнение комманды по какой-то комбинации клавиш.

Про остальные DE не скажу.

Еще есть настройки на уровне иксов. Я в свое время делал регулировку громкости звука и управление плеером XMMS (эх, какие времена были!) по дополнительным клавишам на клавиатуре. Нашел два способа. Сразу скажу что делал это давно, вроде на Слаке или на чем-то еще, так что возможно нужно будет адаптировать под текущее время. Приведу как есть, если будет непонятно — говори, буду напрягать память, разжую.

Источник

послать фоновому процессу нажатие клавиши q

Уважаемые! Подскажите, плиз, как можно послать фоновому процессу нажатие клавиши? Для корректного завершения программы надо ей посылать q (quit), просто убивать не совсем хорошо, она буффер из памяти не дописывает в файл.

Подробнее: Имеется скрипт save-grep: #!/bin/bash filename=»/`date +%y%m%d-%H%M%S`.txt» echo $filename > /lock echo «Write trace file $filename» echo «Press q to stop» /mnt/dom/dect/g1st -d | grep -e 0x3 -e ‘channel number’ -e \(Orig\) -e ALERTING \ -e SETUP -e RELEASE -e ‘I frame’ -e CONNECT -e DATE -e \(Dest\) -e PROCEEDING \ -e ’88\.51\.27 94:52′ >> $filename

Этот скрипт я запускаю из консоли в фон: /mnt/dom/dect/save-grep & Далее командой echo $! > /save-grep.pid записываю номер ее процесса в файл. Сессия по ssh с этим компьютером на этом завершается. По истечении суток в новой сессии надо корректно завершить этот процесс посылкой ему нажатия клавиши q. Как это можно сделать ?

Re: послать фоновому процессу нажатие клавиши q

А если не извращаться с клавишами и фоновыми процессами, а написать правильно — перехватчик сигналов, который все правильно разруливает и прибивать программу обычным способом?

Re: послать фоновому процессу нажатие клавиши q

Программу, запускаемую скриптом, я изменить не могу, нет на нее ничего, кроме бинарника. Да и не программер я, так, погулять вышел :).

Читайте также:  Файл eventlog полностью отсутствует windows 10

Re: Re: послать фоновому процессу нажатие клавиши q

Попробуй запустить свою g1st через конвейер: вместо
/mnt/dom/dect/g1st .

(path to binary)/qfake|mnt/dom/dect/g1st .

где qfake при приеме какого — нибудь сигнала (SIGHUP,
SIGUSR1 или SIGUSR1) будет посылать на дескриптор 1 строку «q\n»
и закругляться.

Re: послать фоновому процессу нажатие клавиши q

Т.е. qfake — внешний обработчик сигналов. Идею понял, спасибо.
Жаль, реализовать пока не смогу — знаний маловато :). Только шелл более-менее и знаю.

Re: Re: послать фоновому процессу нажатие клавиши q

alexey_p (*) (2003-09-19 18:35:12.551224):

> Жаль, реализовать пока не смогу — знаний маловато 🙂

Заглядывай сюда — на днях напишу. Сегодня — нет. Или мыло давай, пришлю код в районе понедельника.

Или — люди, на 20 мин. работы с отладкой — помогите!

Re: послать фоновому процессу нажатие клавиши q

> Заглядывай сюда — на днях напишу. Сегодня — нет. Или мыло давай, пришлю код в районе понедельника
Обязательно буду заглядывать :).
Мейл — nick pues.podolsk.ru
Спасибо, Die-Hard, буду ждать.

Re: послать фоновому процессу нажатие клавиши q

Может я чего не понял, но по-моему исходная постановка задачи некорректна.

Фоновые (background) процессы никогда не получают ввод со своего терминала, более того — попытка что-нибудь с него считать приведет либо к получению SIGTTIN либо EIO (для orphaned). Т.е. процесс ожидающий ввода не может нормально функционировать в фоновом режиме.

Re: послать фоновому процессу нажатие клавиши q

Сорри, я чайник. Сейчас перепроверил — действительно процесс Stopped (tty output). Теперь дошло, что его останавливают именно за input, а не за output — т.е. загнать в фон и отключить терминал действительно не получится.
Жаль — придется по-прежнему из под винды постоянно держать открытым терминал putty на эту машину и просто посылать этому окну nncron-ом нажатие q. А так хотелось убрать это на машину с линуксом и поручить крону — облом-с.
Обидно, что в винде это удалось достаточно несложно реализовать и оно работает. В линуксе без навыков программирования сделать то же самое — похоже, фигушки. Да и с ними в данном случае, видимо, вряд ли возможно. Машина, на которой я это запускаю, не совсем обычна. Это контроллер системы радиодоступа DECT, сделанный под линуксом, без винта, с флэш-диском 40 Мб. Убрано все, что можно, крона тоже нет. Имеющиеся программы без исходников — одни бинари, и их доработки ждать не приходится.
Я смог сделать запись нормального лога работы этого контроллера вышеописанным способом и еще кое-что здорово нужное для нормальной эксплуатации. Вот только если связь по локальной сети с этим компьютером прерывается, процесс остается и работает еще часа два, а в новом терминале после восстановления связи я уже пишу параллельно еще один лог с теми же записями — в общем, бардак. Да и при проведении обслуживания виндовой машины — дефрагментация диска — лог не пишется, я на ней все останавливаю на это время.
Если бы вышеописанное получилось, оно не зависело бы от связи по локалке и перезапускалось кроном с линуксовой машины. Жаль, не выйдет.

Источник

Простой авто-кликер в Linux c помощью небольшого BASH скрипта

Авто-кликер может понадобиться в разных случаях: если нужно автоматизировать нажатие какой-нибудь кнопки, или фармить печеньки в Cookie Clicker. Что-бы без лишней траты времени это сделать, нам понадобится программа xdotool.

  • Создаём текстовый файл с любым названием, в домашней директории(так будет удобнее в будущем запускать сам авто-кликер).
  • Затем открываем его и вставляем туда такой текст:
Читайте также:  Windows убрать поля у окон

Где «2048» в третьей строке — это количество желаемых нажатий, а «1.5» в 5 строке — это интервал в секундах между нажатиями. sleep 5 (2 строка) — это отсчёт в секундах до начала цикла. Ну и ещё прикручено echo для статистики.

Кликать будет левая кнопка мыши. Чтобы эмулировать нажатия правой кнопки мыши, нужно в строке «xdotool click 1» заменить единицу на 3.

  • Сохраняем файл.
  • Затем нужно сделать наш файл исполняемым. Для этого нужно вписать в терминал команду:
    chmod u+x название-файла

Авто-кликер готов! Чтобы его запустить, нужно ввести в терминале команду

Чтобы остановить авто-кликер раньше, чем вписано в файле, нужно просто открыть окно терминала, через которое работает авто-кликер, и нажать сочетание клавиш Сtrl+C.

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

Желаю накликать побольше печенек, надеюсь, чем-то смог помочь.

Источник

Перехват нажатия клавиши на Linux

Перехват нажатия клавиш XGrabKeyboard
Нашёл готовое решение, немного допилил и получился вот такой говнокод: #include .

Получение нажатия клавиши из неактивного окна
Привет всем! Как можно получить нажатую клавишу, если окно приложения не активно?

Скомпилированная программа закрывается после нажатия клавиши
В общем такая проблема, написал прогу на c++ , скомпилировал, у меня всё работает.

Отлов нажатия клавиатуры в Linux
Здравствуйте, может кто то подсказать как сделать глобальный отлов нажатия клавиш клавиатуры? В.

Такое можно сделать и в X11

А вот например в игре, когда человечек прыгает не вверх, а вперед, т.е. наприме если A — прыжок, B — бежать вперед, а когда нажимаешь вместе A и B — человечек прыгает вперед, а не вверх.

( ICANON | ECHO );
tcsetattr( STDIN_FILENO, TCSANOW, &newt );
ch = getchar();
tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
cout 0

Объясните пожалуйста что и для чего тут делается.

Добавлено через 12 часов 49 минут
Объясните пожалуйста хоть что-нибудь.

погрызть или в тырнете поискать.

Добавлено через 4 минуты
если заинтересовался, тебе надо по библиотеке termios искать (заголовочный файл termios.h) — есть обстоятельное мануалище под названием:
Управление терминалами (curses/terminfo)

1/ ты сравниваешь char, а надо int
2/ для пользования курсорных и управляющих клавиш можно использовать макросы. Они описаны в ncurses.h
KEY_LEFT
KEY_RIGHT
KEY_UP
KEY_DOWN
коды их больше 255: 258, 259, 260

посмотри man getch
#include
для компиляции необходимо подключить -lncurses в gcc/g++
3/ примерчик на си:

Добавлено через 16 минут
для создания интерактивных консольных приложений тебе надо бы использовать ncurses.
termios необходимо для установления связи с терминалом и задания атрибутов ввода-вывода (в частности канон/неканон эхо/неэхо). При использовании ncurses можно обойтись используемыми в ней функциями.
Также если не хочется заморачиваться, и хочется покодить «по-быстрому», можно использовать команды баш:
system(«stty -icanon -echo»);
отключает канон и эхо
system(«stty icanon echo»);
соответственно включает

Источник

Настраиваем сочетания клавиш в Linux наподобие Mac OS X


Раньше, у меня довольно часто возникала такая ситуация, когда одновременно работаешь в терминале и, например, в браузере.
После нескольких часов работы начинаешь путаться и в терминале вместо [Ctrl]+[Shift]+[C] нажимаешь [Ctrl]+[C], а в браузере наоборот. В итоге в терминале вы получаете прерывание а в браузере вместо ожидаемого эффекта у вас медленно прогружается дебаггер.
В один прекрасный момент меня это достало и я решил, что пора что-то менять.

Читайте также:  Синхронизация времени windows mobile

До того как я переустановил на своей рабочей машине OSX на Linux, я успел привыкнуть к довольно приятной реализации сочетаний клавиш. А точнее к тому, что все основные операции, такие как «Вырезать», «Копировать» и «Вставить», все они используют кнопку [Cmd] (аналог кнопки [Win] на PC), а не [Ctrl], как это сделано по умолчанию в Linux и Windows. Это очень удобно, так как, повторюсь, если вы часто работаете в терминале, вы имеете единые сочетания клавиш для копирования и вставки как и во всех других приложениях, а прерывание всегда остается на своем месте [Ctrl]+[C].
Вы так же олучите профит от такого способа, если вы используете тайловый оконный менеджер, т.к. в большинстве случаев для использования стандартных операций и переключений между тэгами/окнами вам не придется снимать палец с вашего modkey

Конечно настраивать сочетания клавиш можно в конфигах каждого определенного приложения, но это слишком не удобно, к тому же не каждое приложение поддерживает такую настройку. По этому я решил просто забиндить стандартные сочетания клавиш на те, что нужны мне.
Т.е. нажимая [Win]+[C], ваш терминал будет думать, что вы нажимаете [Ctrl]+[Shift]+[C], а все остальные приложения, что [Ctrl]+[C].

Для реализации задуманного нам понадобятся программа, которая будет отслеживать наши нажатия, например xbindkeys или же можно воспользоваться штатными возможностями вашего оконного менеджера, и эмулятор нажатий на клавиши, их несколько: xdotool, xte и xvkbd.

Правда с первыми двумя у меня возникал один преинтереснийший глюк: если например вы нажимете [Win]+[A], эмулятор покорно передаст [Ctrl]+[A] в приложение, а приложение увидит что нажаты все три клавиши [Win]+[Ctrl]+[A] и не обработает такое сочетание. Этот весьма неприятный баг было не просто обнаружить, так как не помогала даже опция —clearmodifiers для xdotool, которая, казалось бы, специально для такого случая и создана. В xkdbb подобного поведения замечено не было.

Начнем, пожалуй с xbindkeys. Отключем все CapsLock, NumLock и прочие модификаторы, запускаем:

Открывается окошко, в окошке нажимаем сочетание [Win]+[A], в терминале получаем такой вывод:

где Mod4 — это наша клавиша [Win]. Это же можно использовать для написания конфига xbindkeys:

/.xbindkeysrc и пишем:

Теперь запустим xbindkeys:

И попробуем нажать [Win]+[A], эффект будет такой-же как и если бы вы нажали [Ctrl]+[A]

После того что вы убедитесь, что все работает, можно продолжить править кофиг, но перед следующим запуском нужно с начала завершить предыдущий процесс xbindkeys:

Ок, с этим разобрались, но как нам передавать различные сочетания клавиш, при нажатии одних и тех же кнопок, в зависимости от программы с которой мы работем?
На помощь приходит все тот же xdotool и xprop, с помощью которых мы определяем является ли активное окно терминалом.

Давайте напишем простенький скрипт и положим его в /bin/copypaste.sh:

Используйте xprop, если вы не знаете какой класс использует ваша программа:
и клик на окне

Не забываем сделать скрипт исполняемым:

Работает он вот так:

Это же и допишем в наш конфиг

Подобным образом настраиваем сочетания для остальных клавиш.

Источник

Оцените статью