• 首页
  • Qt文档
  • DTK文档
  • 玲珑文档
  • dbus使用方法

    ⼀、需求描述

    需要以root权限运⾏程序或脚本,测试脚本test.sh

    !/bin/bash 添加⽤⼾需要root权限 useradd zhangsan # 调⽤系统⾳乐程序deepin-music

    ⼆、dbus-daemon使⽤⽅法

    1、安装依赖

    $ sudo apt install pkg-config libsystemd-dev libsystemd0 -y

    2、拷⻉配置⽂件

    $ cd dbus鉴权⽰例1.3 $ cp -arp system.d/net.poettering.Calculator.conf /etc/dbus-1/system.d/ $ cp -arp actions/net.poettering.Calculator.policy /usr/share/polkit-1/action/

    3、编译

    test.c是dbus服务端程序test_client.c是dbus客⼾端程序 客⼾端调⽤服务端,服务器调⽤polkit鉴权,鉴权成功,执⾏需要提权的程序。这⾥我们需要提权的程序是test.sh,假设我们把他放在~/Desktop下。 先修改⼀下test.c vim test.c,找到第231⾏,修改成我们需要提权运⾏的命令或程序。

    然后我们进⾏编译,直接在test.c⽬录下执⾏make即可。

    此时会多两个⼆进制的程序,test和test_client。

    4、测试

    启动服务端,需要root权限

    $ sudo ./test

    检查测试⽤⼾是否存在,如果存在删除

    $ id zhangsan >/dev/null 2>/dev/null && sudo userdel zhangsan

    再开启⼀个窗口,启动客⼾端

    $ ./test_client

    这是会弹出⼀个对话框让你输密码鉴权。

    输⼊密码后,如果密码正确,会以root程序调⽤/opt/test.sh脚本

    如果调⽤不成功,可以在服务端窗口看⽇志输出。

    5、验证

    检查⽤⼾是否创建

    $ id zhangsan

    检查deepin-music是否以root权限运⾏

    $ ps -ef | grep deepin-music

    三、dbus打包

    有些客⼾在产品不仅需要安装在时候需要以root权限做⼀些初始化⼯作,也可能在安装后每次以 root权限运⾏。

    1、构建⽬录结构

    $ mkdir -p com.shonentech.rvms/DEBIAN $ mkdir -p com.shonentech.rvms/opt/apps/com.shonentech.rvms/entries/applications $ mkdir -p com.shonentech.rvms/opt/apps/com.shonentech.rvms/entries/icons/hicolor $ mkdir -p com.shonentech.rvms/opt/apps/com.shonentech.rvms//icons/hicolor $ mkdir -p com.shonentech.rvms/opt/apps/com.shonentech.rvms/files/bin

    2、创建control⽂件

    $ vim com.shonentech.rvms/DEBIAN/control

    内容如下:

    Package: com.shonentech.rvms Version: 1.0.0.0 Architecture: amd64 Maintainer: root <root@unknown> Installed-Size: 77284 Section: unknown Priority: optional Depends: pkg-config,libsystemd-dev,libsystemd0 Homepage: <insert the upstream URL, if relevant> Description: <insert up to 60 chars description> <insert long description, indented with spaces>

    3、创建info⽂件

    $ vim com.shonentech.rvms/DEBIAN/control

    内容如下

    { "appid": "com.shonentech.rvms", "name": "rvms", "version": "1.0.0.0", "arch": ["amd64"], "permissions": { "autostart": false, "notification": false, "trayicon": false, "clipboard": false, "account": false, "bluetooth": false, "camera": false, "audio_record": false, "installed_apps": false } }

    4、创建服务⽂件

    dbus服务端程序需要root运⾏,且每次⽤⼾运⾏程序之前dbus服务端必须运⾏,否则⽤⼾⽆法正 常运⾏,我们通过将dbus服务端写成⼀个系统服务并设置开机⾃启来实现。

    $ vim com.shonentech.rvms/opt/apps/com.shonentech.rvms/files/dbus- org.test.service

    内容如下 [Unit] Description=org.dbus.test RefuseManualStop=yes

    [Service] Type=simple PIDFile= ExecStart=/opt/apps/com.shonentech.rvms/files/test

    [Install] WantedBy=multi-user.target

    5、放⼊相关⽂件

    将相关脚本、图标、配置⽂件、程序放⼊。

    图标⽂件

    $ cp -arp RVMS.png opt/apps/com.shonentech.rvms/entries/icons/hicolor/RVMS.png

    dbus服务端和客⼾端

    $ cp -arp test opt/apps/com.shonentech.rvms/files/test $ cp -arp test_client opt/apps/com.shonentech.rvms/files/test_client

    app主程序

    $ cp -arp rvms.sh opt/apps/com.shonentech.rvms/files/bin/rvms.sh

    polkit配置⽂件

    $ cp -arp net.poettering.Calculator.conf opt/apps/com.shonentech.rvms/files/net.poettering.Calculator.conf $ cp -arp net.poettering.Calculator.policy opt/apps/com.shonentech.rvms/files/net.poettering.Calculator.policy

    6、创建desktop⽂件

    $ vim com.shonentech.rvms/opt/apps/com.shonentech.rvms/entries/applications/com.shonen tech.rvms.desktop

    内容如下

    [Desktop Entry] Categories=Utility;

    Comment=This is a application for Return Visit Management System. Comment[zh_CN]=这是⼀个复诊管理系统。

    TryExec=/opt/apps/com.shonentech.rvms/files/test_client

    Exec=/opt/apps/com.shonentech.rvms/files/test_client %U GenericName=RVMS

    GenericName[zh_CN]=复诊管理系统

    Icon=/opt/apps/com.shonentech.rvms/entries/icons/hicolor/RVMS.png Name=RVMS

    Name[zh_CN]=复诊管理系统

    7、创建钩⼦脚本

    deb包⾸次安装的时候需要做⼀些初始化⼯作。且需要root权限,因此我们需要⽤到钩⼦脚本。

    拷⻉配置⽂件拷⻉服务⽂件

    设置服务开机⾃启

    启动服务

    $ vim com.shonentech.rvms/DEBIAN/postinst

    内容如下

    #!/bin/bash cp -arp /opt/apps/com.shonentech.rvms/files/dbus-org.test.service /usr/lib/systemd/system/ cp -arp /opt/apps/com.shonentech.rvms/files/net.poettering.Calculator.conf /etc/dbus-1/system.d/ cp -arp /opt/apps/com.shonentech.rvms/files/net.poettering.Calculator.policy /usr/share/polkit-1/action/ systemctl enable dbus-org.test systemctl start dbus-org.test

    卸载的时候我们也需要将服务清除。

    $ vim com.shonentech.rvms/DEBIAN/postrm

    内容如下

    #!/bin/bash systemctl stop dbus-org.test systemctl disable dbus-org.test rm -f /opt/apps/com.shonentech.rvms/files/dbus-org.test.service /usr/lib/systemd/system/ rm -f /opt/apps/com.shonentech.rvms/files/net.poettering.Calculator.conf /etc/dbus-1/system.d/ rm -f /opt/apps/com.shonentech.rvms/files/net.poettering.Calculator.policy /usr/share/polkit-1/action/

    别忘了给钩⼦脚本授权

    $ sudo chmod 755 com.shonentech.rvms/DEBIAN/post*

    8、打包测试

    最终⽬录如下

    打包

    $ sudo dpkg-deb -b com.shonentech.rvms

    安装,安装后可以看到已经以root权限运⾏了dbus服务端。

    $ ps -ef | grep test

    运⾏测试.. 略

    9、常⻅问题

    调⽤图形化界⾯程序起不来,⾮图形化命令能执⾏成功 问题原因:https://blog.csdn.net/h106140873/article/details/89445448 解决⽅案:在最终调⽤的程序中,加⼊export DISPLAY=:0

    #!/bin/bash

    添加⽤⼾需要root权限

    useradd zhangsan

    调⽤图形化程序之前,先定义环境变量授权

    export DISPLAY=:0

    调⽤系统⾳乐程序

    deepin-music

    deepin-music退出后,再次运⾏程序,打不开 问题原因:通过pstree分析,是由于脚本在调⽤图形化程序的时候,回被阻塞,当图形化程序退出后, 依然被阻塞,不知道是什么原因,导致被调⽤的脚本以及脚本所调⽤的进程都没有退出。 解决⽅案:将被调⽤的图形化程序,放⼊后台运⾏,且在运⾏前,将正在运⾏的程序杀掉,虽然能不作为⼦进程运⾏,不阻塞,但是还是⽆法正常退出。 #!/bin/bash

    添加⽤⼾需要root权限

    useradd zhangsan

    调⽤图形化程序之前,先定义环境变量授权

    export DISPLAY=:0

    杀掉残留进程

    killall deepin-music

    调⽤系统⾳乐程序

    deepin-music &