【问题标题】:Using dbus-send to call GetAll使用 dbus-send 调用 GetAll
【发布时间】:2014-09-02 05:59:20
【问题描述】:

我试试运气:

  dbus-send --system --print-reply  \   
     --dest=org.freedesktop.UDisks \
      /org/freedesktop/UIDisks/devices/md0 \
      org.freedesktop.DBus.Properties.GetAll \
      string:""

如果我使用 d-free 并发送 "" 作为 GetAll 的参数,我得到一长串输出

尝试上面的代码只会报错:

Error org.freedesktop.DBus.Error.UnknownMethod: Method "GetAll" with signature "s" on
interface "org.freedesktop.DBus.Properties" doesn't exist

所以我做错了,但我不知道出了什么问题。我搜索了一个解决方案,但没有想出一个像样的解决方案。也许这很琐碎,但我不知道....

【问题讨论】:

    标签: dbus


    【解决方案1】:

    您需要指定接口名称作为 GetAll 的参数。这个例子对我有用(我有 UDisks2 而不是 UDisks 但其他方面是相似的):

    dbus-send --system --print-reply \
       --dest=org.freedesktop.UDisks2 \ 
       /org/freedesktop/UDisks2/block_devices/loop0 
       org.freedesktop.DBus.Properties.GetAll 
       string:"org.freedesktop.UDisks2.Block"
    

    【讨论】:

    • 抱歉,如果我在 d-feet 中输入一个空字符串,我会得到:{'DeviceAutomountHint': '', 'DeviceBlockSize': 512L, 'DeviceDetectionTime': 1405083881L, 'DeviceFile': '/dev /md0', 'DeviceFileById': ['/dev/disk/by-id/md-uuid-d56d4165:72b8959a:ea459adc:678b0998', '/dev/disk/by-uuid/0bfac438-3d04-4d4e-a71c- 2f4a3e63a8e9'],'DeviceFileByPath':[],'DeviceFilePresentation':'/dev/md0','DeviceIsDrive':真,'DeviceIsLinuxDmmp':假,'DeviceIsLinuxDmmpComponent':假,'DeviceIsLinuxLoop':假,'DeviceIsLinuxLvm2LV':假,'DeviceIsLinuxLvm2PV':假,....
    • 所以必须有一个方法才能真正立即获取所有属性。
    【解决方案2】:

    我试试运气:

    dbus-send --system --print-reply  \   
       --dest=org.freedesktop.UDisks \
        /org/freedesktop/UIDisks/devices/md0 \
        org.freedesktop.DBus.Properties.GetAll \
        string:""
    

    您在对象路径中有错字:您输入了UIDisks 而不是UDisks。修复它应该可以修复您的错误。


    针对您在this answer 上关于一次获取所有属性的评论,D-Bus specification 未指定GetAll 应接受其interface_name 参数的空字符串,因此如果有任何服务,这是一个错误接受这个。相反,您必须为对象上的每个接口调用一次GetAll

    最简单的方法是使用更高级别的 D-Bus 实用程序,例如 gdbusD-Feet(正如您所尝试的那样)。 dbus-send 旨在与 D-Bus 服务进行简单的低级交互。

    $ gdbus introspect --system --dest org.freedesktop.UDisks2 --object-path /org/freedesktop/UDisks2/block_devices/sda1 --only-properties
    node /org/freedesktop/UDisks2/block_devices/sda1 {
      interface org.freedesktop.UDisks2.Partition {
        properties:
          readonly u Number = 1;
          …
      };
      interface org.freedesktop.UDisks2.Filesystem {
        properties:
          readonly aay MountPoints = [b'/boot/efi'];
      };
      …
    }
    

    【讨论】:

      【解决方案3】:

      经过这么多年,我终于解决了这个问题并找到了一些东西。 是的,有时需要一些时间

      dbus-send --system --print-reply \--dest=org.freedesktop.UDisks2 \
      /org/freedesktop/UDisks2/block_devices/sda1 \
      org.freedesktop.DBus.Properties.GetAll \
      string:"org.freedesktop.UDisks2.Filesystem"
      

      工作,至少获得文件系统接口的属性。

      我又花了几个小时才弄清楚这个 dbus-send 的东西。

      【讨论】:

        【解决方案4】:

        错误 org.freedesktop.DBus.Error.UnknownMethod:方法“GetAll”,签名为“s” 接口“org.freedesktop.DBus.Properties”不存在

        我有类似的问题,我运行 d-feet,自省界面,发现, 我不应该写“完整/路径/到/对象”,而只是“/对象”, 在您的情况下,不是“/org/freedesktop/UIDisks/devices/md0”,而是“/md0”。

        如果这没有帮助,请尝试将 dbus 调用中的所有参数与 d-feet 进行比较 秀,我相信你会发现你的问题。

        【讨论】:

          猜你喜欢
          • 2016-07-10
          • 2017-09-18
          • 2011-04-11
          • 2015-02-28
          • 1970-01-01
          • 2013-07-02
          • 2021-11-18
          • 2018-07-16
          • 2020-12-08
          相关资源
          最近更新 更多