我想使用基于 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 身份运行)的情况下运行该程序?
谁能向我解释一下EVin的价值/proc/bus/input/devices是什么?
键盘总是有价值的120013。为什么?
我需要做什么才能获得 /dev/hidraw* 的读取权限?
我看到有关 udev 规则的内容并在网上看到了这一点,但是 udev 的世界对我来说就像是异国他乡,如果有某种更简单的解决方案,我只需将自己添加到一个花花公子的组中...
(Ubuntu 13.10 预览版)
随意重新标记这个问题 - 我不太热衷于 'hidraw' 到底发生了什么。
编辑:
好吧,所以,只需提供更多信息来澄清这个问题:我确实逐步执行了调用 POSIXopen()方法的代码,并获得了errno权限不足的权限。cat以普通用户身份在文件上运行会导致权限不足错误,而在下运行会su导致cat操作成功(尽管毫无意义)。
编辑 编辑:
应要求,我将通过 POSIX 调用提供相关代码。它来自 Signal11(函数hid_open_path)的 HIDAPI 库。我相信这段代码是正确的,因为它显然已经使用了很长时间了。我errno在 GDB 中相关阅读发生的位置添加了一条评论。
hid_device *dev = NULL;
hid_init();
dev = new_hid_device();
if (kernel_version == 0) {
struct utsname name;
int major, minor, release;
int ret;
uname(&name);
ret = sscanf(name.release, "%d.%d.%d", &major, &minor, &release);
if (ret == 3) { …Run Code Online (Sandbox Code Playgroud) 相关问题:USB 连接/断开通知
当设备插入/拔出时,我会收到即时通知,这很棒。但是为了使它(几乎)完美,我还想获得像 一样的设备文件名/dev/ttyUSB0,甚至更好的是,它的所有符号链接。
但是,我无法找到如何从udev、 或 从lsusb或以其他方式获取此信息。我拥有的设备的唯一 ID 是像/devices/pci0000:00/0000:00:1d.0/usb5/5-1. 如何从中获取设备文件名?
两者都读过在 Linux 中挂载设备是什么意思?并将“挂载”理解为操作系统中的一个概念,我有一个问题,说明
所有可访问的存储都必须在此单个目录树中具有关联的位置。这与 Windows 不同,在 Windows 中(在文件路径的最常见语法中)每个存储组件(驱动器)有一个目录树。挂载是将存储设备关联到目录树中的特定位置的行为。
但是已经有一个可访问的位置,例如 /dev/cdrom 下的 cdrom 驱动器,它显然位于目录层次结构中。那么为什么需要在 /media/cdrom 下创建一个单独的“挂载点”呢?为什么无法直接从 /dev/cdrom 访问?听说设备节点文件和普通文件一样。读取和写入它们就像普通文件一样。这是否意味着如果我们从 /dev/cdrom 访问它,cdrom 中的文件系统将不可用。当我们“挂载”它时,文件系统层次结构(在 cdrom 内)“活跃起来”?
我没有访问netcat或nmap因此我试图使用bash和/dev/udp/特殊文件到测试端口。
我可以做这样的事情:
echo "" > /dev/udp/example.com/8000
Run Code Online (Sandbox Code Playgroud)
但在使用 UDP 时$?总是如此0。我假设那是因为那是echo ""命令的返回值正确吗?
我基本上是在尝试复制我能做的事情,nmap并且netcat:
nmap -sU -p 8000 example.com | grep open >/dev/null && echo 'open'
nc -z -u example.com 8000 && echo 'open'
Run Code Online (Sandbox Code Playgroud)
我将如何做到这一点/dev/udp?
假设我插入了几个不会自动安装的 USB 驱动器。如何找出哪个设备文件属于哪个物理设备,以便我可以挂载它?
我正在运行 Mac OS X,但我更喜欢一个适用于所有(或至少是最流行的)Unix 系统的答案。我过去在 Linux 上遇到过这个问题。
Linux 如何或在哪里确定网络设备的分配?具体来说,wlan0或wlan1用于无线 USB 设备。
前段时间插了个TP USB无线,就分配了wlan0。我删除了它。本周我插入了 Edimax USB 无线设备,它显示为wlan1. 我今天取下它来尝试第二个 Edimax USB 无线设备(我买了两个),现在它出现了wlan2。
我对 Unix/Linux 有足够的了解,知道这是在某处配置的,如果我删除未使用的配置文件,我可以使最新的 Edimax 成为wlan0. 但是如何/在哪里?
我使用 Linux Mint 13 MATE,并且在插入/拔出设备时尝试设置通知。
首先,我找到了udev-notify包,但不幸的是它几乎对我不起作用:它工作的时间很短(1-2 分钟),然后,如果我连接/断开任何设备,它会崩溃:
Traceback (most recent call last):
File "./udev-notify.py", line 319, in <module>
notification.show()
glib.GError: GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: The name :1.1061 was not provided by any .service files
Run Code Online (Sandbox Code Playgroud)
我还没有找到任何解决方案,所以我不得不将其删除。(日提交错误报告也)
令人惊讶的是,到目前为止我还没有找到类似的实用程序。然后我尝试编写应该匹配所有设备的 udev 规则。我添加了新文件/etc/udev/rules.d/notify.rules:
ACTION=="add", RUN+="/bin/bash /home/dimon/tmp/device_plug.sh"
ACTION=="remove", RUN+="/bin/bash /home/dimon/tmp/device_unplug.sh"
Run Code Online (Sandbox Code Playgroud)
和两个脚本:
device_plug.sh:
#!/bin/bash
export DISPLAY=":0"
notify-send "device plugged"
/usr/bin/play -q /path/to/plug_sound.wav &
Run Code Online (Sandbox Code Playgroud)
device_unplug.sh:
#!/bin/bash
export DISPLAY=":0"
notify-send "device unplugged"
/usr/bin/play -q /path/to/unplug_sound.wav &
Run Code Online (Sandbox Code Playgroud)
它有效,但它的工作非常愚蠢。我的问题是:
lsusb输出中看到的相同?目前,我只收到诸如“已插入”和“未插入”之类的通知,但我找不到如何在我的 udev 规则中检索设备名称(如果可以,我会将它作为范围)尝试呼叫时/dev/tcp/www.google.com/80,键入
/dev/tcp/www.google.com/80
Run Code Online (Sandbox Code Playgroud)
巴什说no such file or directory。在网上查看其他人的代码时,他们使用的语法如
3<>/dev/tcp/www.google.com/80
Run Code Online (Sandbox Code Playgroud)
我注意到这也有效:
</dev/tcp/www.google.com/80
为什么需要这些符号来调用 bash 中的某些东西?
devices ×10
linux ×7
udev ×3
bash ×2
networking ×2
usb ×2
bsd ×1
console ×1
events ×1
mount ×1
notify-send ×1
osx ×1
permissions ×1
proc ×1
wifi ×1