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
我们还能做些什么来解决这个问题?
解答:我们决定继续运行systemctl
as ,sudo
而不是仅在文件中指定用户.service
,以便服务将以指定用户身份运行,而不是作为root
或运行sudo
。我们选择这种方法是因为下面的答案没有解决问题。
答案1
斯图尔特对于使用来自另一个帐户的命令的XDG_RUNTIME_DIR
不匹配是正确的。UID
su
有时,用户管理器实例也没有为用户运行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
全新会话一样登录。方法:
- 重启
- 退出显示管理器并再次登录
machinectl login
ssh [email protected]
我看过其他帖子,它们执行诸如和等操作mkdir /run/user/$(id -u)
并手动设置环境变量,但最可靠的方法是简单地更改登录方式。干净的登录将为您完成所有这些工作。XDG_RUNTIME_DIR
DBUS_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
完成,现在再试一次。