2017-07-30 38 views
0

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

我定义了一个systemd EnvironmentFile和摆在那里

SSH_AUTH_SOCKET=${SSH_AUTH_SOCKET} 

,并列入emacs.sevice文件。在这里调查我发现 this链接,无法想象这是真的。这意味着在环境文件中设置服务/单元文件中的环境设置是另一回事。他们看不到对方。什么意义,然后一个环境文件?

下一步是从我的登录时间sourced〜/ .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 

这种方法也没有成功。顺便说一下,我们不能相信发布SYSTEMSYSTEM(D)的一些环境变量是非常困难的。

任何答案都是非常受欢迎的。

感谢 福尔克

+0

您是否尝试过使用https://github.com/purcell/exec-path-from-shell包导入您的环境变量? –

回答

0

有一个很好的工具名为钥匙串,将启动一个的ssh-agent/GPG代理,然后倾倒ENV瓦尔到一个文件中。壳可以源文件来获得增值税,其他程序如Emacs可以解析文件以获得增值税。对于Emacs,Melpa中有一个钥匙串环境包。

# .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))