Операция не разрешена
Я хочу выполнить некоторую команду в скрипте Python
import fcntl
KDSETLED = 0x4B32
SCR_LED = 0x01
console_fd = os.open('/dev/console', os.O_NOCTTY)
fcntl.ioctl(console_fd, KDSETLED, SCR_LED)
Я поставил a+rw
за /dev/console
но когда я запускаю скрипт от обычного пользователя:
fcntl.ioctl (console_fd, KDSETLED, SCR_LED) IOError: [Errno 1] Операция не разрешена
Что мне делать, если мне нужно запустить этот скрипт от обычного пользователя?
1 ответ
Решение
Я считаю, что вам нужно выполнить ваш сценарий с CAP_SYS_TTY_CONFIG
, Либо так, либо (если вы работаете на консоли), используя свой управляющий tty (например, /dev/tty1
) вместо /dev/console
может работать.
Код ядра, обеспечивающий это, выглядит как drivers/tty/vt/vt_ioctl.c:
/*
* To have permissions to do most of the vt ioctls, we either have
* to be the owner of the tty, or have CAP_SYS_TTY_CONFIG.
*/
perm = 0;
if (current->signal->tty == tty || capable(CAP_SYS_TTY_CONFIG))
perm = 1;
⋮
case KDSETLED:
if (!perm)
goto eperm;
setledstate(kbd, arg);
break;
Итак, определенно похоже, что это ваши два варианта.