Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 不允许操作_Python_Linux_Ioctl - Fatal编程技术网

Python 不允许操作

Python 不允许操作,python,linux,ioctl,Python,Linux,Ioctl,我想用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(控制台,KDSETLED, SCR_LED)IOError:[Errno

我想用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(控制台,KDSETLED, SCR_LED)IOError:[Errno 1]操作 不允许


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

我认为您需要使用
CAP\u SYS\u TTY\u 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更改键盘指示灯。这肯定是一个不同的问题。Upvote,谢谢你澄清我,尤其是X。还有一个愚蠢的问题:是否也可以与设备进行符号链接(或者类似于#ln-s~/blahblahdev/console/dev/console)?@Alex你可以创建指向任何文件的符号链接,包括设备文件。我建议询问有关Unix/Linux如何在上工作的问题(非编程问题)。