2011-01-14 3 views
3

Я хочу, чтобы запустить какую-либо команду в питон скриптОперация не допускается

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] Operation not permitted

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

ответ

4

Я считаю, вам нужно, чтобы ваш скрипт выполнялся с CAP_SYS_TTY_CONFIG. Либо это, либо (если вы работаете на консоли), использование вашей управляющей команды tty (например, /dev/tty1) вместо /dev/console может работать.

код ядра, который навязывает это, кажется, драйверы/TTY/В.Т./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; 

Так, безусловно, выглядит как эти ваши два варианта.

+0

У меня такая же проблема, она изменена на/dev/tty7, но не понимаю, как обеспечить права пользователя. Не удалось выяснить из вашего псевдокода (?). – Alex

+1

@Alex, это не псевдокод, это C, часть источников ядра Linux. Вам нужно либо запустить ваш код на консоли Linux (не под X), либо, альтернативно, установить этот бит бит (или быть root, который обычно имеет все бит бит). Если вы работаете под X, вы должны использовать X API для изменения светодиодов клавиатуры. Это определенно будет другим вопросом. – derobert

+0

Подпишитесь, спасибо, что разъясните мне, что особенно с X. Еще один глупый вопрос: возможно ли сделать символическую связь с устройствами (или что-то похожее на #ln -s ~/blahblahdev/console/dev/console)? – Alex

Смежные вопросы