Pregunta
Quiero ejecutar algún comando de script en Python
import fcntl
KDSETLED = 0x4B32
SCR_LED = 0x01
console_fd = os.open('/dev/console', os.O_NOCTTY)
fcntl.ioctl(console_fd, KDSETLED, SCR_LED)
He puesto a+rw
para /dev/console
pero cuando corro guión de usuario normal:
fcntl.ioctl (console_fd, KDSETLED, SCR_LED) IOError: [Errno 1] Operación No se permite
¿Qué debo hacer si necesito para ejecutar esa secuencia de comandos de usuario normal?
Solución
Creo que necesita para obtener la secuencia de comandos ejecuta con CAP_SYS_TTY_CONFIG
. O eso, o (si se está ejecutando en la consola), el uso de su terminal controlada (por ejemplo, /dev/tty1
) en lugar de trabajo /dev/console
fuerzas.
El código del kernel que hace cumplir esto parece ser conductores / 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;
Por lo tanto, definitivamente se ve como los que son sus dos opciones.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow