Запустите скрипт Python Portio как обычного пользователя без корневого доступа

Первая вещь, которую мы должны выполнить, выключает мышь, но только в 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

Таким же образом мы должны обработать, "включают" событие:

  1. Проверьте обработчики устройства мыши
  2. Коды ключа от английского замка left+right использования кнопки мыши actkbd
  3. Поместите его в actkbd.conf
  4. Выполненный actkbd демон для контроля устройства ввода данных мыши

Рабочие демоны могли быть поняты как init сценарий или автоматически выполненный сценарий в среде.

К автоматическому выключению мыши мы могли контролировать устройство ввода данных (cat /dev/input/event5) и выключите его, когда не будет никакого входа...

Я надеюсь, что мое короткое введение поможет Вам... ;)

4
18.08.2012, 22:57
2 ответа

Добавьте эту строку к 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: ниже правил без него.

3
27.01.2020, 20:50

Найденный решением здесь.

То, что Вы хотите сделать, записать доверяемую программу включения ввода-вывода в 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.
5
27.01.2020, 20:50

Теги

Похожие вопросы