LINUX.ORG.RU

dbus cессионная шина другого пользователя

 


1

2

Как послать сообщение на чужую (активную) cессионную шину dbus? В моём случае приложение от суперпользователя желает послать сообщение обычному пользователю.

слушаю шину:dbus-monitor --session type='signal',interface='andromeda.listener'
посылка:dbus-send --session --type=signal / andromeda.listener.test

sudo -u user <посылка> не помогает
замена --session на --address=<значение переменной из /home/user/.dbus/session-bus/*-0> результатов тоже не даёт

Как временное решение, использую ssh user@localhost <посылка>

--address=<значение переменной из /home/user/.dbus/session-bus/*-0>

Дистрибутив какой? Современные дистрибутивы так уже давно не делают. Заходи под своим юзером в обычную сессию и смотри у него значение переменной $DBUS_SESSION_BUS_ADDRESS. К ней и подключайся.

Менять юзера на целевого — это правильно, так и делай, даже у рута по умолчанию нет прав на взаимодействие с чужими сессионными шинами.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 2)
Ответ на: комментарий от intelfx

У меня дополнительный вопрос.
Посылку осуществляю так (из под другого пользователя работает только с указанием address):

user@debian:~$ echo $DBUS_SESSION_BUS_ADDRESS
unix:path=/run/user/1000/bus
user@debian:~$ sudo su
[sudo] пароль для user: 
root@debian:/home/user# sudo -u user dbus-send --address=unix:path=/run/user/1000/bus --type=method_call --dest=andromeda.server / andromeda.listener.method
Или так (из под своего пользователя с указанием адреса):
user@debian:~$ dbus-send --address=unix:path=/run/user/1000/bus --type=method_call --dest=andromeda.server / andromeda.listener.method
Или так (из под своего пользователя без указания адреса):
user@debian:~$ dbus-send --session --type=method_call --dest=andromeda.server / andromeda.listener.method
принимаю так:
dbus-monitor --session type='method_call',destination=andromeda.server,interface='andromeda.listener,member=method'
но dbus-monitor мне не подходит для боевой задачи, и в качестве приемника у меня такой код:
//gcc -Wall -o server.run server.c `pkg-config --cflags --libs dbus-1`

#include <dbus/dbus.h>
#include <unistd.h>
#include <stdio.h>


int main()
{
  DBusMessage* msg;
  DBusConnection* conn;
  DBusError err;

  dbus_error_init(&err);
  conn = dbus_bus_get(DBUS_BUS_SESSION, &err);
  dbus_bus_request_name(conn, "andromeda.server", DBUS_NAME_FLAG_REPLACE_EXISTING , &err);
  dbus_connection_flush(conn);

  while (dbus_connection_read_write(conn, 0))
  {
    msg = dbus_connection_pop_message(conn);
    if (NULL == msg)
    {
      sleep(1);
      continue;
    }
    printf("got message\n");
    dbus_message_unref(msg);
    //break;
  }
  dbus_connection_unref(conn);
  return 0;
}
Но он принимает сообщения от dbus-send только от своего пользователя и только с параметром --session. Подскажите что можно сделать, чтобы принималось по аналогии с dbus-monitor от dbus-send с параметром --address.

signijalv52
() автор топика
Ответ на: комментарий от signijalv52

Отвечаю себе же (реализация подсмотрена в коде dbus-monitor): строки dbus_bus_request_name dbus_connection_flush нужно заменить на:

  const char*     filter = "eavesdrop=true,type=method_call,destination=andromeda.server,interface=andromeda.listener,member=method";
  dbus_uint32_t   zero = 0;
  DBusMessage*    m;
  DBusMessage*    r;
  DBusMessageIter appender;
  DBusMessageIter array_appender;
  m = dbus_message_new_method_call (DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_MONITORING, "BecomeMonitor");
  dbus_message_iter_init_append (m, &appender);
  dbus_message_iter_open_container (&appender, DBUS_TYPE_ARRAY, "s", &array_appender);
  dbus_message_iter_append_basic (&array_appender, DBUS_TYPE_STRING, &filter);
  dbus_message_iter_close_container (&appender, &array_appender);
  dbus_message_iter_append_basic (&appender, DBUS_TYPE_UINT32, &zero);
  r = dbus_connection_send_with_reply_and_block (conn, m, -1, &err);
  dbus_message_unref (r);
  dbus_message_unref (m);

signijalv52
() автор топика
Ответ на: комментарий от signijalv52

Есть, правда, один минус. При попытке вернуть результат метода при помощи dbus_message_new_method_return и последующего dbus_connection_send, программа досрочно завершается. Не важно, кто и как прислал метод. Не нахожу подобного описания в доках.

signijalv52
() автор топика

Решение для Debian 9.5
Для посылки в активную сессию другого активного пользователя достаточно совершать посылку от того же пользователя и задачей такой же переменной среды DBUS_SESSION_BUS_ADDRESS. Например, sudo DBUS_SESSION_BUS_ADDRESS=<xxx> -u user2 dbus-send <yyy>

signijalv52
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.