【问题标题】:systemd can not import environment variables like $SSH_AUTH_SOCKsystemd 无法导入 $SSH_AUTH_SOCK 等环境变量
【发布时间】:2017-07-30 15:49:32
【问题描述】:

我在 systemd 的用户空间写了一个服务文件来启动 emacs 守护进程。这工作得很好。但是在 emacsclient 启动时,我让我解密了我的日记文件。为此,我正在运行 gpg-agent。通常当 emacs 启动时,pineentry-gtk 会弹出并提示我输入我的私钥密码。但是使用 systemd 启动守护程序,环境变量 $SSH_AUTH_SOCKET、$GPG_AGENT_INFO 和 SSH_AGENT_PID 是未知的。因此没有 pineentry-gtk 弹出。从系统周围馈送 systemd 的几种方法被卡住了。我想使用动态方法而不是放入绝对路径。

我定义了一个 systemd EnvironmentFile 并放在那里

SSH_AUTH_SOCKET=${SSH_AUTH_SOCKET}   

并将文件包含在 emacs.sevice 中。在这里调查我发现了 this 链接,无法想象这是真的。这意味着服务/单元文件中的环境设置与在环境文件中设置它是另一回事。他们看不见对方。那么一个环境文件有什么意义呢?

下一步是从我的登录时导入环境变量 ~/.bash_profile 像这样。

systemctl --user import-environment GPG_AGENT_INFO
systemctl --user import-environment SSH_AUTH_SOCKET
systemctl --user import-environment SSH_AGENT_PID

登录后,我查看了systemd是否获取了环境变量。我通过输入得到这个

systemctl --user show-environmet

DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
GPG_AGENT_INFO=${GPG_AGENT_INFO}
HOME=/home/xxxx
LANG=de_DE.UTF-8
LOGNAME=xxxx
PATH=/home/xxxx/bin:~/.emacs.d/shell-scripts: .........
AUTH_SOCK=${SSH_AUTH_SOCKET}
USER=xxxx
XDG_RUNTIME_DIR=/run/user/1000

但是在 systemd 环境中启动 emacs 守护进程显示了相同的症状。

下一步是像这样直接在单元/服务文件中导入变量。

[Unit]
Description=Emacs: the extensible, self-documenting text editor

[Service]
# loading default environment for systemd in user space
EnvironmentFile=%h/.config/systemd/xxxx-default-evironment.env

Type=forking
ExecStartPre=/bin/systemctl --user import-environment SSH_AUTH_SOCKET
ExecStart=/usr/bin/emacs --daemon
ExecStartPost=/bin/systemctl --user set-environment    SSH_AUTH_SOCK=${SSH_AUTH_SOCK}
ExecStop=/usr/bin/emacsclient --eval "(kill-emacs)"

Restart=always

[Install]
WantedBy=non-graphical.target

这种方法也没有成功。顺便想不到把SYSTEM的一些环境变量发布到SYSTEM(D)这么难。

非常欢迎任何答案。

谢谢 法尔克

【问题讨论】:

  • 您是否尝试过使用github.com/purcell/exec-path-from-shell 包导入环境变量?
  • 我对 systemd 了解不多,但我想在您的 .bashrc 中运行 systemctl --user import-environment 比 systemd 启动 Emacs 发生的时间?在这种情况下它没有用,因为 Emacs 已经获得了它的环境,它不会包含这些值?

标签: service emacs environment gnupg systemd


【解决方案1】:

有一个名为 keychain 的不错的实用程序,它将启动 ssh-agent/gpg-agent,然后将 env vars 转储到文件中。 Shells 可以只获取文件以获取 var,而 Emacs 等其他程序可以解析文件以获取 var。对于 Emacs,Melpa 中有一个 keychain-environment 包。

# .bash_profile
type keychain >&/dev/null \
    && keychain --agents ssh

# .bashrc
[ -f $HOME/.keychain/$HOSTNAME-sh ] \
    && . $HOME/.keychain/$HOSTNAME-sh

;; init.el
(when (require 'keychain-environment nil 'noerror)
  (keychain-refresh-environment))

【讨论】:

    【解决方案2】:

    您的示例有错字,您需要的环境变量是 SSH_AUTH_SOCK 而不是 SSH_AUTH_SOCKET。此外,您的 ExecStartPre 将作为与 ExecStart 相同环境的一部分运行,因此您不能在那里使用 import。

    我可以使用ssh-find-agent 中的示例通过定位套接字文件在 systemd 用户服务管理器中设置 SSH_AUTH_SOCK。这不是万无一失的,但到目前为止似乎对我来说效果很好。还要记住,使用 import-environment 或 set-environment 将为所有服务启用该值,或者在这种情况下为所有用户服务(因为 --user)。如果您不希望这样做,最好将逻辑移动到包装脚本中并直接执行它而不是服务。

    以下是使用 sshfs 作为 systemd 用户服务单元的一部分的示例:

    # Create mount directory and make sure user has correct permissions
    sudo mkdir /mnt/myserver
    sudo chown $USER:$USER /mnt/myserver
    
    # Create the following file:
    systemctl --user cat sshfs-myserver.service 
    # /home/USERNAME/.config/systemd/user/sshfs-myserver.service
    [Unit]
    AssertPathExists=/mnt/myserver
    
    [Service]
    Type=forking
    ExecStartPre=/bin/bash -c "systemctl --user set-environment SSH_AUTH_SOCK=$(find /tmp/ -type s -name agent.* 2> /dev/null | grep -o '/tmp/ssh-.*/agent.*')"
    ExecStart=/usr/bin/sshfs -o sshfs_debug root@myserver:/ /mnt/myserver
    Restart=no
    
    [Install]
    WantedBy=default.target
    
    
    # Then enable service, run, and check status/env
    systemctl --user enable ssh-myserver
    systemctl --user daemon-reload
    systemctl --user start sshfs-myserver
    systemctl --user show-environment
    systemctl --user status sshfs-myserver
    

    通常你只会使用带有Type=fuse.sshfs 的 systemd 挂载单元,但它们似乎需要以 root 身份运行挂载命令(当我在 --user 单元中尝试时不起作用)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-20
      • 1970-01-01
      • 2016-10-18
      • 2019-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多