Первая вещь, которую мы должны выполнить, выключает мышь, но только в X. Для этого мы могли использовать xinput
.
Мы должны обнаружить устройства ввода данных, которые подключены к компьютеру (к X-серверу):
pbm@tauri ~ $ xinput list
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ A4Tech USB Mouse id=10 [slave pointer (2)]
⎜ ↳ Macintosh mouse button emulation id=11 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
[...]
Устройство, которое мы должны использовать, A4Tech USB Mouse
с id=10
. Затем мы должны проверить свойства того устройства:
pbm@tauri ~ $ xinput list-props "A4Tech USB Mouse"
Device 'A4Tech USB Mouse':
Device Enabled (121): 1
[....]
Для выключения устройства, мы должны изменить свойство Device Enabled
:
xinput set-prop DEV PROP STATE
xinput set-prop "A4Tech USB Mouse" "Device Enabled" 0
Включать его:
xinput set-prop "A4Tech USB Mouse" "Device Enabled" 1
Следующая вещь состоит в том, чтобы сделать это автоматически... ;) В этом примере мы будем отключать мышь сочетанием клавиш и включать его путем нажатия оставленный + правая кнопка мыши.
Для этого мы могли использовать actkbd - клавиатура (но не только) демон ярлыка, который работает за пределами X-сервера.
Сначала мы должны создать пустой конфигурационный файл для actkbd: touch /etc/actkbd.conf
. Следующая вещь состоит в том, чтобы обнаружить устройства, подключенные к компьютеру:
pbm@tauri ~ $ cat /proc/bus/input/devices
I: Bus=0003 Vendor=046d Product=c312 Version=0110
N: Name="BTC USB Multimedia Keyboard"
P: Phys=usb-0000:00:1d.0-1.6/input0
S: Sysfs=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.6/2-1.6:1.0/input/input6
U: Uniq=
H: Handlers=kbd event3
B: EV=120013
B: KEY=1000000000007 ff9f207ac14057ff febeffdfffefffff fffffffffffffffe
B: MSC=10
B: LED=7
I: Bus=0003 Vendor=09da Product=000a Version=0110
N: Name="A4Tech USB Mouse"
P: Phys=usb-0000:00:1d.0-1.5/input0
S: Sysfs=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.5/2-1.5:1.0/input/input8
U: Uniq=
H: Handlers=mouse1 event5
B: EV=17
B: KEY=ff0000 0 0 0 0
B: REL=343
B: MSC=10
[...]
В этой части, самой интересной для использования, имена и обработчики устройств клавиатуры и мыши.
Сначала мы обрабатываем выключение мыши сочетанием клавиш, таким образом, мы должны обнаружить ключевые идентификаторы:
pbm@tauri ~ $ sudo actkbd -s -d /dev/input/event3
Keys: 29+41+42 //we need to press keys that will turn off mouse, 29+41+42 is Ctrl + Shift + `
Когда мы знаем то, что является идентификаторами ключей, мы должны поместить их в файл конфигурации (/etc/actkbd.conf
):
29+41+42:::sudo -u pbm DISPLAY=:0 xinput set-prop "A4Tech USB Mouse" "Device Enabled" 0
Для проверения его, мы должны работать actkbd
в режиме демона:
pbm@tauri ~ $ sudo actkbd -d /dev/input/event3 -D
Таким же образом мы должны обработать, "включают" событие:
actkbd
actkbd.conf
Рабочие демоны могли быть поняты как init сценарий или автоматически выполненный сценарий в среде.
К автоматическому выключению мыши мы могли контролировать устройство ввода данных (cat /dev/input/event5
) и выключите его, когда не будет никакого входа...
Я надеюсь, что мое короткое введение поможет Вам... ;)
Добавьте эту строку к sudoers
файл (используют visudo
программа, никогда не редактируйте sudoers
зарегистрируйте непосредственно), где bob
имя пользователя, которому нужно разрешить запустить скрипт:
bob ALL = (root) NOPASSWD: /path/to/my/script
Если Вы хотите это для многочисленных пользователей, помещаете их в группу resetters
и сделайте это sudoers
строка
%resetters ALL = (root) NOPASSWD: /path/to/my/script
Если существует другое вовлечение правил bob
, заботьтесь, который последнее соответствие включает sudoers
файл. Так помещает правила с NOPASSWD:
ниже правил без него.
Найденный решением здесь.
То, что Вы хотите сделать, записать доверяемую программу включения ввода-вывода в C, который предоставляет доступ только к требуемым портам, затем использует execvp () для выполнения сценария в адресном пространстве вызывающей стороны. Вы будете затем setuid корень к скомпилированному активатору ввода-вывода.
Вот некоторый пример кода, адаптированный из вышеупомянутого источника (убедиться использовать блок адреса, который Вы не возражаете писать в):
#include <stdio.h>
#include <stdlib.h>
#include <sys/io.h>
#define DESIRED_PORT 0x300
#define NUM_BYTES 8
int main(int argc, char*argv[])
{
if (argc < 2) {
printf("Error: no target program specified.\n");
exit(1);
}
if (ioperm(DESIRED_PORT, NUM_BYTES, 1)) {
printf("Error: couldn't set port permissions.\n");
exit(1);
}
// Set uid to current user's id before executing the script
setgid(getgid());
setuid(getuid());
if (execvp(argv[1], &argv[1]) < 0) {
printf("Error: target program execution error.\n");
exit(1);
}
}
Давайте назовем это io_enable.c, затем скомпилируем и корень setuid:
$ gcc io_enable.c -o io_enable
$ sudo chown root io_enable
$ sudo chmod u+s io_enable
Затем, мы можем протестировать его со следующим сценарием Python:
#!/usr/bin/python
import portio
ADDR = 0x300
fd = open('/tmp/portio.log', 'w')
for i in range(10):
portio.outb(i, ADDR)
fd.write('Wrote %d, read %d.\n' % (i, portio.inb(ADDR)))
fd.close()
Я называю это io_test.py и затем выполняю его как так:
$ ./io_enable python io_test.py
Похож это работает:
$ cat /tmp/portio.log
Wrote 0, read 0.
Wrote 1, read 1.
Wrote 2, read 2.
Wrote 3, read 3.
Wrote 4, read 4.
Wrote 5, read 5.
Wrote 6, read 6.
Wrote 7, read 7.
Wrote 8, read 8.
Wrote 9, read 9.