如何让非root用户连接WiFi?

如何让非root用户连接WiFi?

/etc/os-releaseDebian GNU/Linux 9 (stretch)

/proc/versionLinux 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";
    • 如果没有使用-Oand ,而使用了while,则需要像之前一样设置该选项;请注意,包含在-i-s-Owpa_请求者-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

相关内容