![如何使用正确的环境变量通过 ssh 连接启动 systemd 用户单元?](https://linux22.com/image/173342/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E6%AD%A3%E7%A1%AE%E7%9A%84%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E9%80%9A%E8%BF%87%20ssh%20%E8%BF%9E%E6%8E%A5%E5%90%AF%E5%8A%A8%20systemd%20%E7%94%A8%E6%88%B7%E5%8D%95%E5%85%83%EF%BC%9F.png)
我有一个 systemd --user 单元,从机器的控制台(Arch Linux)运行时可以正确运行。但是,当我 ssh 进入计算机并运行相同的命令来启动用户单元时,它失败了。错误是:
[user@remote ~]$ systemctl --user start my-user-service.service
Failed to connect to bus: No such file or directory
[user@remote ~]$ systemctl --user show-environment
Failed to connect to bus: No such file or directory
我已经UsePAM yes
在 sshd_config 中设置了。
如果我将以下 2 行添加到远程计算机上的用户.bashrc
(在以该用户身份连接 SSH 会话之前),我可以解决该问题。
export XDG_RUNTIME_DIR="/run/user/$UID"
export DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/bus"
然而,Arch Wiki 中没有提到该方法,因此我认为不建议使用它。我尝试了所有提到的方法在 systemd/User#Environment_variables包括编写环境生成器脚本。我无法让他们中的任何一个人工作。在每种情况下,都是上面首先显示的相同错误。
这是我尝试过的一个简单的生成器:/usr/lib/systemd/user-environment-generators/40-user-env-generator
#!/bin/bash
echo XDG_RUNTIME_DIR="/run/user/$UID"
echo DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/bus"
解决这个问题的正确方法是什么?
编辑:添加新信息:
猫 /etc/pam.d/sshd
#%PAM-1.0
#auth required pam_securetty.so #disable remote root
auth include system-remote-login
account include system-remote-login
password include system-remote-login
session include system-remote-login
猫 /etc/pam.d/system-remote-login
#%PAM-1.0
auth include system-login
account include system-login
password include system-login
session include system-login
猫 /etc/pam.d/system-login
#%PAM-1.0
auth required pam_tally2.so onerr=succeed file=/var
/log/tallylog
auth required pam_shells.so
auth requisite pam_nologin.so
auth include system-auth
account required pam_tally2.so
account required pam_access.so
account required pam_nologin.so
account include system-auth
password include system-auth
session optional pam_loginuid.so
session optional pam_keyinit.so force revoke
session include system-auth
session optional pam_motd.so motd=/etc/motd
session optional pam_mail.so dir=/var/spool/mail standard quiet
-session optional pam_systemd.so
session required pam_env.so
猫 /etc/pam.d/system-auth
#%PAM-1.0
auth required pam_unix.so try_first_pass nullok
auth optional pam_permit.so
auth required pam_env.so
account required pam_unix.so
account optional pam_permit.so
account required pam_time.so
password required pam_unix.so try_first_pass nullok sha512 shadow
password optional pam_permit.so
session required pam_limits.so
session required pam_unix.so
session optional pam_permit.so
答案1
sshd
检查, ie的 PAM 设置/etc/pam.d/sshd
以及它使用关键字引用的任何文件@include
。
应该有一个pam_systemd.so
在会话阶段调用的模块,如下所示:
session optional pam_systemd.so
除此之外,该 PAM 模块将初始化两个环境变量XDG_RUNTIME_DIR
和DBUS_SESSION_BUS_ADDRESS
。
答案2
注意:如果本地一切正常,则问题与 以外的其他事物有关*-environment-generators
。
对于问题的解决方法,我建议您替换$UID
为$(id -ru)
(因为可以不设置 env 变量并使用 not user-environment-generators
but system-environment-generators
(参见https://man.archlinux.org/man/systemd.environment-generator.7)因为守护进程本身systemctl --user
是作为系统服务,因此受系统环境影响。
答案3
确保 SSH 服务器配置为使用 PAM 模块。在/etc/ssh/sshd_config或者/etc/ssh/sshd_config.d/99-local.conf放
UsePAM yes