2017-07-30 99 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))