mic*_*ael 14 linux permissions devices console
我想使用基于 SDL 的程序在控制台上显示图形,而无需从控制台登录,也无需以 root 身份运行该程序。例如,我希望能够通过 ssh 运行它。目标操作系统是 raspbian。
这是python中的一个简短示例来说明问题:
import os, pygame
os.environ['SDL_VIDEODRIVER'] = 'fbcon'
pygame.init()
s = pygame.display.set_mode()
print "Success"
Run Code Online (Sandbox Code Playgroud)
如果我从控制台运行它,这可以工作(运行完成,不会抛出异常),如果我以 root 身份运行它,它可以通过 ssh 工作。
我已检查我的用户是否在音频和视频组中。
我已经使用 strace 来查看从控制台运行它(有效)、通过 ssh 以 root 身份运行(也有效)和通过 ssh 以普通用户身份运行(无效)之间有什么不同。
第一个区别是我的用户没有访问 /dev/tty0 的权限。我创建了一个新组 (tty0),将我的用户放在该组中,并添加了一条 udev 规则以授予该组访问 /dev/tty0 的权限。
在此 ioctl 调用中,strace 输出出现分歧 - 此处显示失败;当程序从控制台运行或以 root 身份从 ssh 运行时,ioctl 返回 0:
open("/dev/tty", O_RDWR) = 4
ioctl(4, VT_GETSTATE, 0xbeaa01f8) = -1 EINVAL (Invalid argument)
Run Code Online (Sandbox Code Playgroud)
(地址也不同,但这并不重要。)
鉴于我的程序在以 root 身份运行时可以工作,我认为这意味着我有权限问题。我如何向我的用户授予必要的权限,使其能够在不登录控制台(并且不以 root 身份运行)的情况下运行该程序?
小智 2
虽然您的问题有点含糊(控制台是什么意思),但我将尝试回答最常见的情况:/dev/console、/dev/tty、/dev/fb0 ...将此适应您需要的设备。我们假设用户名是“myuser”。
odroid@mbrxu3:~/projects/sc$ ls -l /dev/console
crw------- 1 root root 5, 1 Oct 23 17:49 /dev/console
odroid@mbrxu3:~/projects/sc$ ls -l /dev/tty
crw-rw-rw- 1 root tty 5, 0 Oct 24 17:50 /dev/tty
odroid@mbrxu3:~/projects/sc$ ls -l /dev/fb0
crw-rw---- 1 root video 29, 0 Jan 1 2000 /dev/fb0
Run Code Online (Sandbox Code Playgroud)
该组是“root”,但不允许任何组访问。我不喜欢只向根组添加权限,因此我创建一个组并 chgrp 文件并更改权限
$ sudo addgroup --system console
$ sudo chgrp console /dev/console
$ sudo chmod g+rw /dev/console
$ sudo usermod -a -G console <myuser> <==== replace <myuser>
Run Code Online (Sandbox Code Playgroud)
$ sudo usermod -a -G tty <myuser>
Run Code Online (Sandbox Code Playgroud)
$ sudo usermod -a -G video <myuser>
Run Code Online (Sandbox Code Playgroud)
如果您需要的话,您也可以使用usermod命令将您的用户添加到上述所有组中。