루트가 아닌 시스템 서비스가 BLE 작업에 dbus를 사용하도록 허용하는 방법

루트가 아닌 시스템 서비스가 BLE 작업에 dbus를 사용하도록 허용하는 방법

저는 작은 라즈베리 보드에서 루트로 실행되는 BLE 주변 장치의 프로토타입을 제작해 왔습니다. 이제 무언가를 강화하고 BLE 애플리케이션을 루트가 아닌 사용자에게 분할하고 있습니다. 따라서 애플리케이션의 시스템 서비스 파일을 다음과 같이 변경했습니다.

[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루트가 아닌 사용자에게 특정 용도를 허용하는 것입니다. 거기에 하나 bluetooth.conf가 있습니다 . /etc/dbus-1/system.d내 애플리케이션이 BLE DBus 서비스를 계속 사용할 수 있도록 하려면 이 파일에서 뭔가를 조정해야 합니까?

답변1

기술적으로 @Mark의 답변은 내가 원하는 것을 달성하기 위해 dbus 블루투스 프로필을 조정하는 방법에 대한 질문에 대답했지만, 파일을 살펴본 후 게시하기 전에 알아차렸으면 좋았을 내용을 발견했습니다. 그룹 bluetooth은 버스를 이용할 수 있습니다. 따라서 나에게 더 간단한(아마도 더 정확할까요?) 방법은 루트가 아닌 사용자를 블루투스 그룹에 추가하는 것입니다. 이는 또한 모든 것이 원활하게 실행되도록 합니다.

답변2

에서 /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

관련 정보