Systemd

如何允許非 root systemd 服務使用 dbus 進行 BLE 操作

  • March 1, 2017

我一直在製作一個 BLE 外圍設備的原型,該外圍設備在一個類似樹莓的小板上以 root 身份執行。現在我正在強化事情並將 BLE 應用程序分區給非 root 使用者。因此,我將應用程序的 systemd 服務文件更改為:

[Unit]
Description=BLE Peripheral

[Service]
Type=simple
ExecStart=/usr/bin/python3 -u /opt/myPeripheral/bleMainloop
WorkingDirectory=/opt/myPeripheral
StandardOutput=journal
Restart=on-failure
User=blePeripheral

[Install]
WantedBy=multi-user.target 

添加了以使用者User身份執行的欄位後blePeripheral,它現在無法啟動,原因是:

dbus.exceptions.DBusException: org.freedesktop.DBus.Error.AccessDenied: Rejected send message, 2 matched rules; type="method_call", sender=":1.6797" (uid=107 pid=17300 comm="/usr/bin/python3 -u /opt/pilot/bleMainloop ") interface="org.freedesktop.DBus.ObjectManager" member="GetManagedObjects" error name="(unset)" requested_reply="0" destination=":1.2" (uid=0 pid=1373 comm="/usr/lib/bluetooth/bluetoothd -d -E --noplugin=* “)

認為我需要做的是以某種方式允許dbus此非 root 使用者使用。我看到有一個bluetooth.confin /etc/dbus-1/system.d。我是否需要調整此文件中的某些內容以允許我的應用仍使用 BLE DBus 服務?

/etc/dbus-1/system.d/bluetooth.conf中,嘗試添加:

<policy user="blePeripheral">
 <allow own="org.bluez"/>
 <allow send_destination="org.bluez"/>
 <allow send_interface="org.bluez.GattCharacteristic1"/>
 <allow send_interface="org.bluez.GattDescriptor1"/>
 <allow send_interface="org.freedesktop.DBus.ObjectManager"/>
 <allow send_interface="org.freedesktop.DBus.Properties"/>
</policy>

然後重啟dbus服務:

systemctl restart dbus

雖然從技術上講@Mark 的回答回答瞭如何調整 dbus 藍牙配置文件以實現我想要的問題,但我在查看該文件後注意到我希望在發布之前註意到的一些內容。該bluetooth組可以使用公共汽車。所以對我來說更容易(也許更正確?)的事情就是將我的非 root 使用者添加到藍牙組。這也可以讓事情正常工作。

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