标签: dbus

如何找到unix socket连接的另一端?

我有一个进程(dbus-daemon),它通过 UNIX 套接字有许多打开的连接。这些连接之一是 fd #36:

=$ ps uw -p 23284
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
depesz   23284  0.0  0.0  24680  1772 ?        Ss   15:25   0:00 /bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session

=$ ls -l /proc/23284/fd/36 
lrwx------ 1 depesz depesz 64 2011-03-28 15:32 /proc/23284/fd/36 -> socket:[1013410]

=$ netstat -nxp | grep 1013410
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it …
Run Code Online (Sandbox Code Playgroud)

linux unix netstat socket dbus

45
推荐指数
5
解决办法
7万
查看次数

如何配置 D-Bus 和 SSH X-Forwarding 以防止 SSH 在退出时挂起?

我正在尝试通过 X11 转发和 SSH 运行各种 Gnome 应用程序。某些应用程序会导致首先生成“dbus-launch”应用程序。问题是当退出 X 应用程序时 dbus-launch 不会关闭,因此必须在 SSH 会话可以正确关闭之前终止。

我认为问题是 X/Gnome 应用程序无法与主消息总线守护进程连接,因此必须启动它们自己的副本?我怎样才能解决这个问题?或者我错过了什么?

这是一个例子。我启用了 X11 转发,似乎一切正常。

[me@host ~]$ gnome-calculator &
[1] 4803
Run Code Online (Sandbox Code Playgroud)

(这里 gcalctool 程序启动并显示到我的删除 X 服务器(Xming))

[me@host ~]$ ps
  PID TTY          TIME CMD
 4706 pts/0    00:00:00 bash
 4803 pts/0    00:00:00 gnome-calculator
 4807 pts/0    00:00:00 dbus-launch
 4870 pts/0    00:00:00 ps
Run Code Online (Sandbox Code Playgroud)

(现在,在远程会话中关闭 gcalctool 应用程序后)

[me@host ~]$ ps
  PID TTY          TIME CMD
 4706 pts/0    00:00:00 bash
 4807 pts/0    00:00:00 dbus-launch
 4898 pts/0    00:00:00 ps
Run Code Online (Sandbox Code Playgroud)

请注意, dbus-launch 仍处于活动状态。最糟糕的是,这会阻止 SSH 连接正确关闭,直到它被终止。 …

linux x11 dbus

21
推荐指数
2
解决办法
3万
查看次数

在无头系统上启动共享会话 D-Bus 的 systemd 服务

我需要帮助在无头 Linux 系统上启动通过会话(不是系统)D-Bus 进行通信的服务。关键是没有人会登录无头系统。

到目前为止,我已经能够在三个不同的终端中代表未登录的用户(“其他用户”)启动 D-Bus 守护程序并测试 D-Bus 通信:

在第一个终端中,我为“otheruser”启动了一个 D-Bus 守护进程:

$ sudo -u otheruser dbus-daemon --session --print-address 1
unix:abstract=/tmp/dbus-a5cU7r4IHc,guid=6c0a9bbfd02f5f68da0fe32f5a5e0a48
Run Code Online (Sandbox Code Playgroud)

在第二个终端中,我使用上述 DBUS_SESSION_BUS_ADDRESS 响应启动 D-Bus 服务器应用程序:

$ sudo -u otheruser DBUS_SESSION_BUS_ADDRESS="unix:abstract=/tmp/dbus-a5cU7r4IHc,guid=6c0a9bbfd02f5f68da0fe32f5a5e0a48" /usr/bin/my-dbus-service
Run Code Online (Sandbox Code Playgroud)

然后,在第三个终端中,我可以测试连接:

$ sudo -u otheruser DBUS_SESSION_BUS_ADDRESS="unix:abstract=/tmp/dbus-a5cU7r4IHc,guid=6c0a9bbfd02f5f68da0fe32f5a5e0a48" gdbus introspect --session --dest com.mycompany.myappname --object-path /com/mycompany/interface
Run Code Online (Sandbox Code Playgroud)

但是,我想通过 systemd 启动 D-Bus 服务器应用程序以及一些客户端 D-Bus 服务。如何通过 systemd 启动 D-Bus 会话,以便将其 DBUS_SESSION_BUS_ADDRESS 环境变量传播到“otheruser”的 D-Bus 服务器和客户端服务?

一种可能的解决方案可能是将 dbus-daemon 的输出通过管道传输到“somefile”,然后在启动 D-Bus 服务器和客户端之前设置 DBUS_SESSION_BUS_ADDRESS=$(cat somefile)。这对我来说似乎有点太尴尬了;特别是因为我知道系统D-Bus 连接的 systemd 服务文件中的“Busname”指令有一些神奇之处。如何为“其他用户”正确启动 systemd 服务,以便这些 systemd 服务可以与会话 D-Bus 接口进行通信?

linux headless dbus systemd

14
推荐指数
1
解决办法
2万
查看次数

由于“无法获得 D-bus 连接:权限被拒绝”,无法使用 `systemctl --user`

我正在尝试使用类似问题的答案来设置用户级服务。我已经创建了所需的文件并重新启动。

我正在取得进展,因为我现在收到“无法获得 D 总线连接:权限被拒绝”,而“无法获得 D 总线连接:连接被拒绝”,但我很困惑,因为我不知道是什么对象它正在尝试访问(文件?套接字?),因此甚至无法检查当前权限。有任何想法吗?

到目前为止,我已经添加了:

loginctl enable-linger userservice
Run Code Online (Sandbox Code Playgroud)

/usr/lib/systemd/user/dbus.service (-rw-r--r-- root root)

[Unit]
Description=D-Bus User Message Bus
Requires=dbus.socket

[Service]
ExecStart=/usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation
ExecReload=/usr/bin/dbus-send --print-reply --session --type=method_call --dest=org.freedesktop.DBus / org.freedesktop.DBus.ReloadConfig

[Install]
Also=dbus.socket
Run Code Online (Sandbox Code Playgroud)

/usr/lib/systemd/user/dbus.socket (-rw-r--r-- root root)

[Unit]
Description=D-Bus User Message Bus Socket

[Socket]
ListenStream=%t/bus
ExecStartPost=-/bin/systemctl --user set-environment DBUS_SESSION_BUS_ADDRESS=unix:path=%t/bus

[Install]
WantedBy=sockets.target
Also=dbus.service
Run Code Online (Sandbox Code Playgroud)

/home/userservice/.config/systemd/user/userservice.service

[Unit]
Description=Test user-level service

[Service]
Type=dbus
BusName=com.wtf.service
ExecStart=/home/userservice/userservice.py
Restart=on-failure

[Install]
WantedBy=default.target
Run Code Online (Sandbox Code Playgroud)

没有在别处添加任何链接...

让它失败:

systemctl --user status
Run Code Online (Sandbox Code Playgroud)

编辑 2018-10-25:

添加export XDG_RUNTIME_DIR=/run/user/$(id -u) …

dbus systemd systemctl

9
推荐指数
3
解决办法
3万
查看次数

使用 socat 远程访问 D-Bus

描述:

我想从另一台机器访问 D-Bus 系统服务,只知道机器的 IP 地址和要连接的服务。

我最近发现的是Gabriel(通过 SSH 的 D-Bus)。我已经编译了它的 GIT 版本(托管在 Sourceforge 上),这似乎有效,但我一直遇到缺乏“保持活动”的问题。这意味着在一段时间不活动后,SSH 隧道无法将 D-Bus 请求转发到远程 PC,我必须重新启动 Gabriel。

由于 Gabriel 在它连接的 PC 上使用 socat,我刚刚有了在本地 PC 上也使用 socat 的想法(用它代替 Gabriel)。

问题:

  • 任何更熟悉设置“socat”的人都可以确认该解决方案吗?
  • 这样的解决方案能否同时处理连接到同一个远程 D-Bus 服务的多个客户端应用程序?
  • 因为我没有必要确保连接安全 - 在双方使用“socat”是否会使连接速度明显加快(与 Gabriel 的 SSH 隧道相反,如果 SSH 提供太多开销)?
  • 有没有人有更好的远程访问 D-Bus 的解决方案?

任何意见表示赞赏。

linux ssh redirection socat dbus

8
推荐指数
1
解决办法
5478
查看次数

由于 /var/run/dbus/system_bus_socket 连接超时,Fedora VM 上的身份验证缓慢

我有这个 Fedora VM,由于某种原因,一段时间后总是开始进行非常缓慢的“sudo”身份验证(或一般的身份验证,例如 GUI 应用程序要求凭据)。它会正常工作,直到某个时刻 (*) 它开始等待 20 秒以上,然后才会显示密码提示。

(*) 那一刻可能是在我暂停并重新启动 VM 之后,但我无法可靠地重现这一点。

我想我将它追溯到与 DBus 有关的事情,因为执行 sudo 的“跟踪”给了我这个:

 0.000040 connect(8, {sa_family=AF_LOCAL, sun_path="/var/run/dbus/system_bus_socket"}, 33) = 0
 0.000095 fcntl(8, F_GETFL)         = 0x2 (flags O_RDWR)
 0.000035 fcntl(8, F_SETFL, O_RDWR|O_NONBLOCK) = 0
 0.000039 geteuid()                 = 0
 0.000038 getsockname(8, {sa_family=AF_LOCAL, NULL}, [2]) = 0
 0.000060 poll([{fd=8, events=POLLOUT}], 1, 0) = 1 ([{fd=8, revents=POLLOUT}])
 0.000041 sendto(8, "\0", 1, MSG_NOSIGNAL, NULL, 0) = 1
 0.000090 sendto(8, "AUTH EXTERNAL 30\r\n", 18, MSG_NOSIGNAL, NULL, 0) = 18
 0.000135 poll([{fd=8, …
Run Code Online (Sandbox Code Playgroud)

sudo dbus

6
推荐指数
1
解决办法
691
查看次数

如何以 root 身份正确启动 dbus-monitor --session?

我正在编写一个脚本,该脚本将检测 Gnome 会话是否以及何时被用户“锁定”,以踢出该用户并防止人们在公共使用实验室中锁定屏幕。但是,似乎唯一的方法是启动一个 dbus-monitor,如下所示:

dbus-monitor --session \ "type=signal,interface=org.gnome.ScreenSaver"
Run Code Online (Sandbox Code Playgroud)

不幸的是,无论我尝试了多少事情,我都无法以 root 身份运行它。我尝试了以下方法:

1

eval `dbus-launch`
dbus-monitor --session ...
Run Code Online (Sandbox Code Playgroud)

这无法启动并出现相同的错误

2

export $(dbus-launch)
dbus-monitor --session ...
Run Code Online (Sandbox Code Playgroud)

这将启动但未成功监视消息。

3

eval `dbus-launch`
export DBUS_SESSION_BUS_ADDRESS
dbus-monitor --session ...
Run Code Online (Sandbox Code Playgroud)

这会启动但不监视消息

当我得到 X11 会话错误时的确切错误如下:

Failed to open connection to session message bus: dbus-launch failed to autolaunch D-Bus session: Fd 4 did not have the close-on-exec flag set!  Setting the flag.
Xlib: connection to ":0.0" refused by server
Xlib: No protocol specified

Autolaunch error: X11 initialization failed.
Run Code Online (Sandbox Code Playgroud)

很简单,我需要能够远程监控会话 …

linux redhat gnome dbus

3
推荐指数
1
解决办法
1万
查看次数

标签 统计

dbus ×7

linux ×5

systemd ×2

gnome ×1

headless ×1

netstat ×1

redhat ×1

redirection ×1

socat ×1

socket ×1

ssh ×1

sudo ×1

systemctl ×1

unix ×1

x11 ×1