如何讓非root使用者連接WiFi?
/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,沒有桌面,沒有滑鼠或鍵盤。
問題是 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
,將其更改為包含DIR和GROUP屬性的字元串,將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
和-c
are used,那麼可以在wpa_supplicant配置文件中設置GROUP屬性(例如,用option 指定);例子:。-c``ctrl_interface=DIR=/run/wpa_supplicant GROUP=netdev
您可以在上面的範例中使用
/var/run
代替,因為通常是./run``/var/run``/run