операция не разрешена

Я хочу запустить некоторую команду в скрипте 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] Операция не разрешена

Что мне делать, если мне нужно запустить этот скрипт от обычного пользователя?


person Max Frai    schedule 14.01.2011    source источник


Ответы (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;

Итак, определенно похоже, что это два ваших варианта.

person derobert    schedule 14.01.2011
comment
У меня тоже такая же проблема, я изменился на /dev/tty7, но не понимаю, как обеспечить права пользователя. Не удалось понять из вашего псевдокода (?). - person Alex; 12.03.2014
comment
@Alex, это не псевдокод, это C, часть исходного кода ядра Linux. Вам нужно либо запустить свой код на консоли Linux (не под X), либо, в качестве альтернативы, установить этот бит возможностей (или быть root, у которого обычно установлены все биты возможностей). Если вы работаете под X, вы должны использовать API-интерфейсы X для изменения светодиодов клавиатуры. Это определенно был бы другой вопрос. - person derobert; 12.03.2014
comment
Upvote, спасибо, что разъяснили мне это, особенно с X. Еще один глупый вопрос: можно ли также сделать символическую ссылку с устройствами (или что-то подобное, например, #ln -s ~/blahblahdev/console /dev/console)? - person Alex; 13.03.2014
comment
@Alex, вы можете сделать символическую ссылку, указывающую на любой файл, включая файлы устройств. Я предлагаю задавать вопросы о работе Unix/Linux (вопросы, не связанные с программированием) на Unix.SE. - person derobert; 13.03.2014