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 ssh
我pc2
已经能够看到,当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 --system
或dbus-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 +++