LINUX.ORG.RU

перехватить нажатие клавиши в консоли


0

0

как можно перехватить нажатие клавиши в консоли , т.е. не устраивают ioctl и прочие , хочется чтоб был демон , который бы перехватывал нжатия клавиш, вне зависимости от того на какой из вирт. консолей была нажата клавиша

P.S. Х-ы не интересуют :)

anonymous

Что мешает в /etc/inittab на все терминалы повесить демона, который открывает сеансы пользователям на псевдотерминалах?

Не все функции терминалов будут работать (например, мышь в mc), но для реализации довольно просто.

Или нужно чтобы демон захватывал терминалы в runtime? Тогда нужно лезть в ядро. Помнится, как-то давно я писал драйвер для 2.4 для перехвата терминального ввода, на RSDN в архивах наверняка до сих пор валяется, могу поискать ссылку, если оно надо.

Murr ★★
()
Ответ на: комментарий от Murr

http://www.rsdn.ru/Forum/?mid=345580 Вот ссылка. Этот код(или слегка подправленный) работал на 2.4.20, для более поздних, вероятно, понадобится доработка. И вообще, там надо внимательно поглядеть на блокировки - не исключено, что не весь код аккуратно синхронизируется (давно это было эээх).

Murr ★★
()
Ответ на: комментарий от Murr

Удивительно, но даже после литра пива удалось заставить это работать на 2.6.9 (FC3). Наверное, не все так уж плохо в датском королевстве (то бишь в развитии linux kernel).

diff -u ./Makefile /usr/src/spymod/Makefile
--- ./Makefile  2004-11-15 02:36:19.728064528 +0300
+++ /usr/src/spymod/Makefile    2004-11-15 02:24:07.012454232 +0300
@@ -1,10 +1,21 @@
-spy:spymod spyclient
-
-spymod: spymod.c spyinc.h
-        gcc -g -c spymod.c -I/lib/modules/`uname -r`/build/include
+spy:kmod_build spyclient

 spyclient: spyclient.c spyinc.h
-        gcc -o spyclient spyclient.c
+       gcc -o spyclient spyclient.c

 clean:
-        rm -f spymod.o spyclient
+       rm -f spymod.o spyclient
+
+obj-m           += spymod.o
+spyclient-objs   = spymod.o
+spyclient-hdrs   = spyinc.h
+
+KDIR            = /lib/modules/`uname -r`/build
+PWD             = $(shell pwd)
+
+spyclient-cfiles    = ${spymod-objs:.o=.c}
+
+kmod_build:: $(spymod-cfiles) $(spymod-hdrs)
+       $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
+
+
diff -u ./spyinc.h /usr/src/spymod/spyinc.h
--- ./spyinc.h  2004-11-15 02:36:31.121332488 +0300
+++ /usr/src/spymod/spyinc.h    2004-11-15 02:24:39.918451760 +0300
@@ -38,6 +38,7 @@
         pid_t listener;
 } spymod_slot_t;

+#ifndef __KERNEL__
 #include <stdio.h>
 static inline int open_dev (dev_t dev, mode_t mode) {
     char * str = tmpnam (NULL), * name;
@@ -55,3 +56,4 @@
     unlink (name);
     return fd;
 }
+#endif
diff -u ./spymod.c /usr/src/spymod/spymod.c
--- ./spymod.c  2004-11-15 02:38:54.897475192 +0300
+++ /usr/src/spymod/spymod.c    2004-11-15 02:32:32.823559256 +0300
@@ -22,8 +22,6 @@
  *
  */

-#define __KERNEL__
-#define MODULE
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/init.h>
@@ -35,13 +33,13 @@
 #include <asm/uaccess.h>
 #include "spyinc.h"

-spymod_slot_t slots[SPYMOD_MAX_SLOTS] = {[0 ... SPYMOD_MAX_SLOTS-1] = {0, 0, 0, 0}};
+static spymod_slot_t slots[SPYMOD_MAX_SLOTS] = {[0 ... SPYMOD_MAX_SLOTS-1] = {0, 0, 0, 0}};

-unsigned char spybuf[SPYMOD_MAX_SLOTS][SPYMOD_MAX_BUFS];
-unsigned int  spybuflen[SPYMOD_MAX_SLOTS] = {[0 ... SPYMOD_MAX_SLOTS-1] = 0};
-spinlock_t    spybuflock = SPIN_LOCK_UNLOCKED;
+static unsigned char spybuf[SPYMOD_MAX_SLOTS][SPYMOD_MAX_BUFS];
+static unsigned int  spybuflen[SPYMOD_MAX_SLOTS] = {[0 ... SPYMOD_MAX_SLOTS-1] = 0};
+static spinlock_t    spybuflock = SPIN_LOCK_UNLOCKED;

-static int spydev_acquire_slot () {
+static int spydev_acquire_slot (void) {
   int i;

   for (i=0; i<SPYMOD_MAX_SLOTS; i++)
@@ -62,7 +60,6 @@


 static void spydev_release_slot (int slot_num) {
-  MOD_DEC_USE_COUNT;
   slots[slot_num].tty->ldisc.receive_buf = slots[slot_num].saved_receive_routine;
   slots[slot_num].tty = NULL;
   fput (slots[slot_num].fp);
@@ -80,8 +77,8 @@

 static void spymod_hook_receive_buf(struct tty_struct *tty, const unsigned char *cp, char *fp, int count)
 {
-        int     slot, to_copy;
-        int     listener;
+        int     slot, to_copy = -1;
+        int     listener = -1;
         unsigned long cpuflags;
         void    (*receive_buf)(struct tty_struct *, const unsigned char *, char *, int) = NULL;

@@ -149,7 +146,6 @@
     return -EBUSY;
   }

-  MOD_INC_USE_COUNT;
   slots[slot].tty = tty;
   slots[slot].saved_receive_routine = tty->ldisc.receive_buf;
   slots[slot].listener = current->pid;
@@ -208,15 +204,15 @@
     return to_copy;
 }

-struct file_operations spymod_fops = {
+static struct file_operations spymod_fops = {
   .ioctl = spydev_ioctl
 };

-struct file_operations spystream_fops = {
+static struct file_operations spystream_fops = {
   .read = spystream_read
 };

-int spymod_init () {
+static int spymod_init() {

     if (register_chrdev (SPYMOD_MAJOR, "spydev", &spymod_fops) != 0 ||
         register_chrdev (SPYSTREAM_MAJOR, "spystream", &spystream_fops) != 0) {
@@ -228,13 +224,14 @@
     return 0;
 }

-void spymod_exit () {
+static void spymod_exit() {
     if (unregister_chrdev (SPYMOD_MAJOR, "spydev") != 0 ||
         unregister_chrdev (SPYSTREAM_MAJOR, "spystream") != 0) {
             printk ("SPYMOD: failed to unregister spy devices! Please contact author!\n");
     }
-    printk ("SPYMOD module unloaded.");
+    printk ("SPYMOD module unloaded.\n");
 }

-module_init (spymod_init);
-module_exit (spymod_exit);
+module_init(spymod_init);
+module_exit(spymod_exit);
+MODULE_LICENSE("GPL");

Murr ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.