如何使用正确的环境变量通过 ssh 连接启动 systemd 用户单元?

如何使用正确的环境变量通过 ssh 连接启动 systemd 用户单元?

我有一个 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_DIRDBUS_SESSION_BUS_ADDRESS

答案2

注意:如果本地一切正常,则问题与 以外的其他事物有关*-environment-generators

对于问题的解决方法,我建议您替换$UID$(id -ru)(因为可以不设置 env 变量并使用 not user-environment-generatorsbut 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

相关内容