【问题标题】:Operation not permitted不允许操作
【发布时间】:2011-01-14 20:28:10
【问题描述】:

我想在 python 脚本中运行一些命令

import fcntl

KDSETLED = 0x4B32
SCR_LED  = 0x01

console_fd = os.open('/dev/console', os.O_NOCTTY)
fcntl.ioctl(console_fd, KDSETLED, SCR_LED)

我已经为/dev/console 设置了a+rw,但是当我从普通用户运行脚本时:

fcntl.ioctl(console_fd, KDSETLED, SCR_LED) IOError: [Errno 1] 操作 不允许

如果我需要从普通用户运行该脚本,我该怎么办?

【问题讨论】:

    标签: python linux ioctl


    【解决方案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;
    

    所以,看起来这绝对是你的两个选择。

    【讨论】:

    • 我也有同样的问题,改成/dev/tty7但是不明白怎么保证用户权限。无法从您的伪代码中弄清楚 (?)。
    • @Alex 这不是伪代码,而是 C,Linux 内核源代码的一部分。您需要让您的代码在 Linux 控制台上运行(而不是在 X 下),或者设置该功能位(或者是 root,通常设置了所有功能位)。如果您在 X 下运行,您应该使用 X API 来更改键盘 LED。那肯定是一个不同的问题。
    • 赞成,谢谢你澄清我,尤其是 X。还有一个愚蠢的问题:是否也可以与设备建立符号链接(或类似 #ln -s ~/blahblahdev/控制台 /dev/console)?
    • @Alex 你可以创建一个指向任何文件的符号链接,包括设备文件。我建议在Unix.SE 上询问有关 Unix/Linux 如何工作的问题(非编程问题)。
    猜你喜欢
    • 2012-01-03
    • 2021-02-10
    • 2021-01-01
    • 2014-11-01
    • 2014-06-30
    • 2012-03-19
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多