`systemctl --host root@pc2` 不起作用但是 `ssh root@pc2 systemctl` 可以吗?

`systemctl --host root@pc2` 不起作用但是 `ssh root@pc2 systemctl` 可以吗?

systemctl有一个--host选项用于在名称主机上执行名为 systemctl 的命令。手册页建议在后台使用 ssh,因此对我来说更令人困惑的是,在我的例子中

systemctl --host root@pc2 is-active docker

不起作用(无输出,退出代码:)1,但是

ssh root@pc2 systemctl is-active docker

是(输出:active,退出代码:)0

我似乎找不到调试此问题的方法。systemctl-o verbose命令上的设置不会提供任何输出。

知道哪里出了问题或者如何调试它吗?


更新

使用journalctl -f | grep sshpc2已经能够看到,当systemctl --host root@pc2 is-active docker运行时,ssh 连接似乎成功(Accepted publickey for root from IP-of-PC1...)。

答案1

该命令确实使用 SSH,但它实际上并不远程执行 systemctl – 它旨在直接与远程系统的 D-Bus IPC 通道通信。为此,它会systemd-stdio-bridge在远程机器上调用,该机器连接到 D-Bus“系统总线”并来回传递消息。然后,本地 systemctl 会向远程 systemd 发出 API 调用,通过 SSH 检索数据并在本地对其进行格式化。

一个可能的问题是你的远程系统没有D-Bus 系统总线完全运行(即可能没有dbus-daemon --systemdbus-broker --system进程)。在这种情况下,直接远程 systemctl 调用仍可工作,因为它有一个后备“私有”套接字,可直接与 pid1 通信 - 但 systemd-stdio-bridge 帮助程序将无法工作,因为它仅设计用于连接到完全正常工作的总线。

用于strace查看 systemctl 在后台运行的内容:

pc1 $ strace -f -e execve -v -- systemctl -H root@pc2 处于活动 httpd
[pid 660170] execve(“/ usr / bin / ssh”,[“ ssh”,“ -xT”,“--”,“ root @ pc2”,“ systemd-stdio-bridge”],0x7ffcd35cd548 / * 74 变量 */)= 0

...以及它能够连接到哪些套接字(作为 root,它将使用私有套接字,作为非 root,它将使用通用系统总线):

pc2# strace -f -e connect systemctl is-active 命名
连接(3,{sa_family=AF_UNIX,sun_path="/run/systemd/private"},23)= 0
积极的
pc2# strace -f -e 连接 systemd-stdio-bridge < /dev/null
connect(4,{sa_family=AF_UNIX,sun_path="/run/dbus/system_bus_socket"},30) = -1 ENOENT(没有此文件或目录)
+++ 退出,返回 1 +++

相关内容