我已经在我的 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 系统中)。