如何全局定义变量

如何全局定义变量

我已经在我的 Manjaro 上设置ssh-agent为 systemd 服务(按照来自这里)。除了服务本身之外,SSH_AUTH_SOCK还需要将环境变量设置为${XDG_RUNTIME_DIR}/ssh-agent.socket。上面提到的指示说要把它放进去.zshrc或同等的东西。这对于大多数应用程序来说都非常有效,因为我在需要使用 ssh-agent 时主要使用命令行。

但是,当从 dmenu 启动 VSCode 时,它​​不会运行.zshrc,因此不会继承$SSH_AUTH_SOCK环境变量。因此,为了让它工作,我需要全局设置该变量。看着拱门维基,唯一的方法(我可以看到)是通过pam_env。然而,这对我不起作用;我放

SSH_AUTH_SOCK         DEFAULT=${XDG_RUNTIME_DIR}/ssh-agent.socket

/etc/environment,但 VSCodeprocess.env仍然没有定义该变量。我也尝试过

SSH_AUTH_SOCK           DEFAULT=/run/user/1000/ssh-agent.socket 

但它仍然没有设置。

请注意,这绝对是一个环境问题,就好像我从 shell 启动 VSCode(.zshrc运行时)一样,它确实继承了$SSH_AUTH_SOCK.一个非常相似的问题是在这里报道,但实际上并没有解决方案。

答案1

解决方案:

添加/etc/security/pam_env.conf

SSH_AUTH_SOCK  DEFAULT=${XDG_RUNTIME_DIR}/ssh-agent.socket

其他有用的花絮:

为什么最初不起作用/etc/environment:

/etc/environment~/.pam_environment遵循与or不同的格式/etc/security/pam_env.conf如此处记录的:

/etc/environment:

VARIABLE=value

~/.pam_environment/etc/security/pam_env.conf

VARIABLE [DEFAULT=value] [OVERRIDE=value]

所以我只是格式错误。

为什么使用/etc/security/pam_env.conf而不是其他两个?:

因为它是现在和将来完全有效的唯一选择。

/etc/environment不读取环境变量,因此${XDG_RUNTIME_DIR}不起作用。您可以对 的内容进行硬编码$XDG_RUNTIME_DIR,但变量(及其目录)由pam_systemd基于每个用户动态地。因此,它不是一个可靠的选择。

~/.pam_environment将成功完成相同的任务/etc/security/pam_env.conf,但它“已被弃用,并将在将来的某个时候被删除”(犯罪)。因此,为了面向未来,不应使用它。

就这样离开了/etc/security/pam_env.conf。它现在可以使用${XDG_RUNTIME_DIR}并且不会被弃用。

答案2

在我的系统中/usr/bin/code无非就是一个shell脚本。您可以通过添加额外的导出语句来修改它,或者从另一个脚本调用它,首先导出所需的环境变量。例如:

#!/bin/zsh

export SSH_AUTH_SOCK="$XDG_RUNTIME_DIR/ssh-agent.socket"

/usr/bin/code #path to your executable for VSCode

/etc/X11/Xsession如果我们在 Linux 环境中讨论 X11 - X11 会话的全局环境设置可以在放入目录的文件中设置,或者更好/etc/X11/Xsession.d

对于用户设置,请使用或$HOME/.xsession替代$HOME/.Xsession.$HOME/.xsessionrc

该文件的使用包含在 main 中/etc/X11/Xsession(至少在我的 Debian 系统中)。

相关内容