/etc/os-release
说Debian GNU/Linux 9 (stretch)
/proc/version
说Linux version 4.4.132+ (jenkins@fdc-06) (gcc version 5.4.0 20160609 (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.9) ) #1 SMP
sudo /sbin/wpa_supplicant -v
印刷wpa_supplicant v2.4
我正在/etc/wpa_supplicant/wpa_supplicant.conf
配置文件中设置这些权限。
两种方法都尝试过,有记录的一:
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=linaro
阅读该请求者的源代码后我发现了另一个:
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=linaro
它们都不起作用:
$ ls -la /var/run/wpa_supplicant
ls: cannot open directory '/var/run/wpa_supplicant': Permission denied
$ sudo ls -la /var/run/wpa_supplicant
srwxrwx--- 1 root root 0 Mar 22 19:24 wlan0
不管配置中写了什么,所有者和组都是 root。
几个月前,在 Linux 4.4.71+ 上工作正常。
如何设置 UNIX 套接字的权限?
PS 一些背景:这是在 ARM SoC 上运行的嵌入式系统。我以编程方式使用该控制界面,即我需要我的软件,在普通用户帐户下运行,控制 Wi-Fi:连接、断开连接、设置密码等。没有运行 Linux 桌面或 X-windows。
更新:按照评论中的建议,添加更多上下文。这是基于定制的嵌入式设备RK3288,运行 Linux 内核,最小的 systemd 服务集(wpa_supplicant 就是其中),以及我开发的单个应用程序。用户使用触摸屏并通过网络与我的应用程序交互(但首先他们需要以某种方式进行连接)。没有 X 窗口或 Wayland,没有桌面,没有鼠标或键盘。
答案1
实际上,设置与 UNIX 套接字关联的非 root 组的配置的方法是wpa_请求者非常奇怪(并且没有记录)。以下步骤可能有用。
- 创建一个群组(利纳罗在你的情况下);无论如何,我将在我的示例中使用“netdev”,它应该已经存在于大多数发行版中(如果不存在:)
sudo groupadd netdev
; - 将用户关联到该组(例如,对于用户“我的用户“
sudo usermod -a -G netdev my_user
:); - 检查如何wpa_请求者已启动 (
ps -ef | grep wpa_supplicant
):- 如果
-O
使用该选项,例如-O /run/wpa_supplicant
,请将其更改为字符串,包括目录和团体属性、赋值团体到网络开发者, 像-O "DIR=/run/wpa_supplicant GROUP=netdev"
; - 如果没有使用
-O
and ,而使用了while,则需要像之前一样设置该选项;请注意,包含在-i
-s
-O
wpa_请求者-c
在这种情况下将不会使用配置文件(例如选项);正确配置示例:/sbin/wpa_supplicant -u -s -O "DIR=/run/wpa_supplicant GROUP=netdev"
; - 如果
-O
没有使用,而-i
和-c
被使用,那么你可以设置团体属性中的wpa_请求者配置文件(例如,用-c
选项指定);例子:ctrl_interface=DIR=/run/wpa_supplicant GROUP=netdev
。
- 如果
您可以在上面的示例中使用/var/run
来代替,因为通常是 的符号链接。/run
/var/run
/run
答案2
问题是 wpa_supplicant 没有加载我的配置。不确定它根本加载了任何配置,我无法在文档或源代码中找到默认配置的路径。以下是修复方法。
sudo nano /lib/systemd/system/wpa_supplicant.service
找到以下行:
ExecStart=/sbin/wpa_supplicant -u -s -O /run/wpa_supplicant
将其更改为
ExecStart=/sbin/wpa_supplicant -u -s -iwlan0 -c/etc/wpa_supplicant/wpa_supplicant.conf
重新启动 Linux 以应用更改。
不确定以前的操作系统版本是否有wpa_supplicant.service
,或者以前的 wpa_supplicant 使用默认配置;将以前的操作系统闪存到 NAND 只是为了检查这一点有点复杂。
PS 这是命令行帮助的相关部分。
-c = Configuration file
-C = ctrl_interface parameter (only used if -c is not)
-i = interface name
-I = additional configuration file
-d = increase debugging verbosity (-dd even more)
-f = log output to debug file instead of stdout
-g = global ctrl_interface
-G = global ctrl_interface group
-s = log output to syslog instead of stdout
-O = override ctrl_interface parameter for new interfaces
-q = decrease debugging verbosity (-qq even less)
-u = enable DBus control interface
-W = wait for a control interface monitor before starting
答案3
使用wpa_priv
以 root 身份启动 wpa_priv
(例如,从系统启动脚本)并在命令行上配置启用的接口:
wpa_priv -B -c /var/run/wpa_priv -P /var/run/wpa_priv.pid [driver:interface]
wpa_priv -B -c /var/run/wpa_priv -P /var/run/wpa_priv.pid nl80211:wlan0
然后,wpa_supplicant
使用 wpapriv 组中的用户以非 root 身份运行:
wpa_supplicant -i wlan0 -c wpa_supplicant.conf
检查wpa_priv
手册页:
https://www.linux.org/docs/man8/wpa_priv.html