无法获得 D-Bus 连接:连接被拒绝

无法获得 D-Bus 连接:连接被拒绝

sudo名为的用户在尝试重新加载Amazon Linux 2 EC2 映像my-host时收到以下错误消息。systemctl

[my-host@ip-12-3-4-56 ~]$ systemctl --user daemon-reload
Failed to get D-Bus connection: Connection refused

具体需要做什么来解决和消除此错误?

我发现的关于此错误消息的其他帖子要么与 Debian 相关,其apt-get解决方案不适用于此处,要么与 Docker 映像相关,该解决方案也不适用于此处。

如果问题与用户权限有关,需要采取什么措施来修复该问题?

这台机器有一个要求,systemctl像这样的一些命令不能作为sudo.

根据 @Stewart 和 @JdeBP 的建议再次尝试直接登录用户:

然后我们尝试使用具有来自外部世界的直接 ssh 能力的 sudo 用户,但仍然得到以下结果:

[ssh-login-user@ip-12-3-4-567 ~]$ systemctl --user daemon-reload
Failed to get D-Bus connection: No such file or directory
[ssh-login-user@ip-12-3-4-567 ~]$ echo $XDG_RUNTIME_DIR $UID
/run/user/1001 1001
[ssh-login-user@ip-12-3-4-567 ~]$ systemctl --user status
Failed to get D-Bus connection: No such file or directory
[ssh-login-user@ip-12-3-4-567 ~]$ sudo install -d -o ssh-login-user /run/user/`id -u ssh-login-user`
[sudo] password for ssh-login-user:
[ssh-login-user@ip-12-3-4-567 ~]$ sudo systemctl start user@`id -u ssh-login-user`
Failed to start [email protected]: Unit not found.
[ssh-login-user@ip-12-3-4-567 ~]$ sudo -u ssh-login-user DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/`id -u ssh-login-user`/bus systemctl --user
Failed to get D-Bus connection: No such file or directory

为了确认 的状态systemctl,我们还执行了以下操作,报告了一项降级服务,如下所示:

● ip-12-3-4-567.aws-region-n.compute.internal
    State: degraded
     Jobs: 0 queued
   Failed: 1 units
    Since: Wed 2020-10-28 23:40:50 UTC; 7min ago
   CGroup: /
           ├─1 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
           ├─user.slice
           │ └─user-1001.slice
           │   └─session-2.scope
           │     ├─18736 sshd: ssh-login-user [priv]
           │     ├─18738 sshd: ssh-login-user@pts/0
           │     ├─18739 -bash
           │     ├─18792 sudo systemctl status
           │     └─18793 systemctl status
           └─system.slice
             ├─rngd.service
             │ └─2692 /sbin/rngd -f
             ├─amazon-ssm-agent.service
             │ ├─3810 /usr/bin/amazon-ssm-agent
             │ └─4428 /usr/bin/ssm-agent-worker
             ├─libstoragemgmt.service
             │ └─2694 /usr/bin/lsmd -d
             ├─systemd-udevd.service
             │ └─1968 /usr/lib/systemd/systemd-udevd
             ├─system-serial\x2dgetty.slice
             │ └─[email protected]
             │   └─3273 /sbin/agetty --keep-baud 115200,38400,9600 ttyS0 vt220
             ├─chronyd.service
             │ └─2685 /usr/sbin/chronyd
             ├─auditd.service
             │ └─2646 /sbin/auditd
             ├─systemd-journald.service
             │ └─1931 /usr/lib/systemd/systemd-journald
             ├─atd.service
             │ └─3239 /usr/sbin/atd -f
             ├─sshd.service
             │ └─3486 /usr/sbin/sshd -D
             ├─crond.service
             │ └─3529 /usr/sbin/crond -n
             ├─gssproxy.service
             │ └─2711 /usr/sbin/gssproxy -D
             ├─rsyslog.service
             │ └─3229 /usr/sbin/rsyslogd -n
             ├─rpcbind.service
             │ └─2683 /sbin/rpcbind -w
             ├─network.service
             │ ├─2919 /sbin/dhclient -q -lf /var/lib/dhclient/dhclient--eth0.lease -pf /var/run/dhclient-eth0.pid eth0
             │ └─3034 /sbin/dhclient -6 -nw -lf /var/lib/dhclient/dhclient6--eth0.lease -pf /var/run/dhclient6-eth0.pid eth0
             ├─lvm2-lvmetad.service
             │ └─1953 /usr/sbin/lvmetad -f
             ├─postfix.service
             │ ├─3177 /usr/libexec/postfix/master -w
             │ ├─3178 pickup -l -t unix -u
             │ └─3179 qmgr -l -t unix -u
             ├─acpid.service
             │ └─3456 /usr/sbin/acpid
             ├─dbus.service
             │ └─2681 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
             ├─system-getty.slice
             │ └─[email protected]
             │   └─3274 /sbin/agetty --noclear tty1 linux
             └─systemd-logind.service
               └─2686 /usr/lib/systemd/systemd-logind

我们还能做些什么来解决这个问题?

解答:我们决定继续运行systemctlas ,sudo而不是仅在文件中指定用户.service,以便服务将以指定用户身份运行,而不是作为root或运行sudo。我们选择这种方法是因为下面的答案没有解决问题。

答案1

斯图尔特对于使用来自另一个帐户的命令的XDG_RUNTIME_DIR不匹配是正确的。UIDsu

有时,用户管理器实例也没有为用户运行UID(即[电子邮件受保护])。

因此,您会收到以下错误消息:

Failed to get D-Bus connection: No such file or directory

检查这些是否存在:

ls -l /usr/lib/systemd/system/user{,-runtime-dir}@.service

如果是这样,请启动用户管理器实例用户UID作为根用户:

systemctl start user@USER_UID.service

否则请阅读更多内容手册[email protected]

一些有用的链接:

答案2

您如何登录my-host

如果它是 with su,我发现它/run/user/$UID没有创建并且XDG_RUNTIME_DIR没有更新。

user ~ $ echo $XDG_RUNTIME_DIR $UID
/run/user/1000 1000

user ~ $ su my-host

my-host ~ $ echo $XDG_RUNTIME_DIR $UID
/run/user/1000 1001                     <-- Mismatch here! 

my-host ~ $ systemctl --user status
Failed to connect to bus: Permission denied

由于未更改,systemd 正在尝试连接到没有权限的$XDG_RUNTIME_DIR原始用户的用户运行时。my-host

根据系统开发人员:

“su”是一种用于临时更改用户身份和极少数其他进程凭据的工具。它不是用于打开全新登录会话的工具。新的登录会话具有定义良好的原始设置,不会从任何其他会话继承任何内容,但“su”uid 更改实际上并非如此:大多数执行环境都是继承的,以大量且不明显的方式继承方式,例如 MAC 上下文、审计上下文、cgroup 上下文、命名空间上下文、调度、计时器粒度、

答案是像my-host全新会话一样登录。方法:

  1. 重启
  2. 退出显示管理器并再次登录
  3. machinectl login
  4. ssh [email protected]

我看过其他帖子,它们执行诸如和等操作mkdir /run/user/$(id -u)并手动设置环境变量,但最可靠的方法是简单地更改登录方式。干净的登录将为您完成所有这些工作。XDG_RUNTIME_DIRDBUS_SESSION_BUS_ADDRESS

答案3

我写的另一个答案对于您的用户登录的情况有效。您对该答案的评论表明您没有远程登录。听起来像是my-host系统用户。

我们经常想要使用用户总线的原因是,用户可以使用 来控制自己的设备systemctl并使用 来查看自己的日志journalctl。如果用户是没有登录的系统用户,那么就没有人可以控制总线,因此它没有任何意义。

不要使用 systemd 用户总线,请考虑使用 systemd 系统总线。

如果您需要以特定用户身份运行应用程序,只需添加User=到您的[Service]部分即可。然后它将作为系统总线的一部分运行,但以非特权系统用户身份执行。也许这就是您systemctl --user最初想要做的事情。

如果您正在运行一个包含调用的应用程序<systemd/sd-bus.h>或一个调用的脚本systemctl,并且您希望将其运行为my-host,则仍然可以在不使用 的情况下授予对系统总线的访问权限sudo。这需要一些 polkit 规则这个答案中描述的或在这个答案。如果您也想使用系统的journal,请添加my-host到群组systemd-journal或按照说明操作这里

答案4

您需要为您的用户启用 systemctl 控制...

首先获取你的UID:

id 

示例输出:
uid=1001(ocp) gid=1001(ocp) 组=1001(ocp),988(libvirt)

然后使用 sudo 或 root 设置你的权限:

sudo machinectl shell --uid = 1001

完成,现在再试一次。

相关内容