Linux

如何讓非root使用者連接WiFi?

  • April 21, 2021

/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,沒有桌面,沒有滑鼠或鍵盤。

問題是 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

實際上,設置與wpa_supplicant的 UNIX 套接字關聯的非根組的配置的方法非常奇怪(並且沒有記錄)。以下步驟可能很有用。

  • 創建一個組(在您的情況下為linaro);無論如何,我將在我的範例中使用“netdev”,它應該已經存在於大多數發行版中(如果不存在:)sudo groupadd netdev

  • 將使用者與該組關聯(例如,對於使用者“ my_user ” :) sudo usermod -a -G netdev my_user

  • 檢查wpa_supplicant是如何啟動的(ps -ef | grep wpa_supplicant):

    • 如果-O使用該選項,例如-O /run/wpa_supplicant,將其更改為包含DIRGROUP屬性的字元串,將GROUP分配給netdev,例如 in -O "DIR=/run/wpa_supplicant GROUP=netdev"
    • 如果-O-i不使用,而-s使用,那麼你需要-O像以前一樣設置選項;注意在這種情況下不會使用wpa_supplicant配置文件中包含的任何設置(例如選項);-c正確配置範例:/sbin/wpa_supplicant -u -s -O "DIR=/run/wpa_supplicant GROUP=netdev";
    • 如果-O不使用,while-i-care used,那麼可以在wpa_supplicant配置文件中設置GROUP屬性(例如,用option 指定);例子:。-c``ctrl_interface=DIR=/run/wpa_supplicant GROUP=netdev

您可以在上面的範例中使用/var/run代替,因為通常是./run``/var/run``/run

引用自:https://unix.stackexchange.com/questions/508067