3

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] 操作は許可されていません

通常のユーザーからそのスクリプトを実行する必要がある場合はどうすればよいですか?

4

1 に答える 1

4

でスクリプトを実行する必要があると思いますCAP_SYS_TTY_CONFIG。それか、(コンソールで実行している場合/dev/tty1)代わりに制御 tty (例: ) を使用するとうまくいく/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;

したがって、間違いなくこれらが 2 つの選択肢のように見えます。

于 2011-01-14T20:53:02.100 に答える