标签: devices

如何让 SDL 应用程序(不以 root 身份运行)使用控制台

我想使用基于 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 身份运行)的情况下运行该程序?

linux permissions devices console

14
推荐指数
1
解决办法
6401
查看次数

解释/proc/bus/input/devices数据中的EV

谁能向我解释一下EVin的价值/proc/bus/input/devices是什么?

键盘总是有价值的120013。为什么?

linux devices proc events

14
推荐指数
1
解决办法
1万
查看次数

/dev/hidraw:读取权限

我需要做什么才能获得 /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)

udev devices

14
推荐指数
2
解决办法
3万
查看次数

如何从 lsusb 输出或通过设备路径获取设备文件名

相关问题:USB 连接/断开通知

当设备插入/拔出时,我会收到即时通知,这很棒。但是为了使它(几乎)完美,我还想获得像 一样的设备文件名/dev/ttyUSB0,甚至更好的是,它的所有符号链接。

但是,我无法找到如何从udev、 或 从lsusb或以其他方式获取此信息。我拥有的设备的唯一 ID 是像/devices/pci0000:00/0000:00:1d.0/usb5/5-1. 如何从中获取设备文件名?

linux usb udev devices

14
推荐指数
2
解决办法
2万
查看次数

无法理解安装的概念

两者都读过在 Linux 中挂载设备是什么意思?并将“挂载”理解为操作系统中的一个概念,我有一个问题,说明

所有可访问的存储都必须在此单个目录树中具有关联的位置。这与 Windows 不同,在 Windows 中(在文件路径的最常见语法中)每个存储组件(驱动器)有一个目录树。挂载是将存储设备关联到目录树中的特定位置的行为。

但是已经有一个可访问的位置,例如 /dev/cdrom 下的 cdrom 驱动器,它显然位于目录层次结构中。那么为什么需要在 /media/cdrom 下创建一个单独的“挂载点”呢?为什么无法直接从 /dev/cdrom 访问?听说设备节点文件和普通文件一样。读取和写入它们就像普通文件一样。这是否意味着如果我们从 /dev/cdrom 访问它,cdrom 中的文件系统将不可用。当我们“挂载”它时,文件系统层次结构(在 cdrom 内)“活跃起来”?

linux mount devices

14
推荐指数
3
解决办法
2918
查看次数

使用 bash 的 `/dev/udp`,我怎么知道端口是否打开?

我没有访问netcatnmap因此我试图使用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

networking bash devices

14
推荐指数
2
解决办法
2万
查看次数

如果我连接一个物理设备,我怎么知道哪个设备文件属于它?

假设我插入了几个不会自动安装的 USB 驱动器。如何找出哪个设备文件属于哪个物理设备,以便我可以挂载它?

我正在运行 Mac OS X,但我更喜欢一个适用于所有(或至少是最流行的)Unix 系统的答案。我过去在 Linux 上遇到过这个问题。

linux osx bsd usb devices

13
推荐指数
1
解决办法
6552
查看次数

wlan号码分配

Linux 如何或在哪里确定网络设备的分配?具体来说,wlan0wlan1用于无线 USB 设备。

前段时间插了个TP USB无线,就分配了wlan0。我删除了它。本周我插入了 Edimax USB 无线设备,它显示为wlan1. 我今天取下它来尝试第二个 Edimax USB 无线设备(我买了两个),现在它出现了wlan2

我对 Unix/Linux 有足够的了解,知道这是在某处配置的,如果我删除未使用的配置文件,我可以使最新的 Edimax 成为wlan0. 但是如何/在哪里?

linux networking wifi devices

13
推荐指数
1
解决办法
2万
查看次数

从 udev 规则调用通知发送

我使用 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)

它有效,但它的工作非常愚蠢。我的问题是:

  1. 如何获取附加设备的实际标题,与我在lsusb输出中看到的相同?目前,我只收到诸如“已插入”和“未插入”之类的通知,但我找不到如何在我的 udev 规则中检索设备名称(如果可以,我会将它作为范围)
  2. 目前,激活的通知太多。比如说,当我连接 U 盘时,我收到了大约 15 …

udev notifications devices notify-send

13
推荐指数
1
解决办法
1万
查看次数

为什么 &lt; 或 &gt; 需要使用 /dev/tcp

尝试呼叫时/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 中的某些东西?

linux bash io-redirection devices

13
推荐指数
2
解决办法
3799
查看次数