私はOfflineIMAPを設定して、gpg暗号化ファイルを介して認証するようにしています(これにより、すべての暗号化をgpg-agentプロセスに統合できます)。
ドキュメントから、サーバーのパスワードを暗号化する唯一の方法は、gnome-keyringを使用することです(これは、ヘッドレスサーバーでは実行しない方がよいでしょう)。 muttでできるように、gpgファイルから私のパスワードをパイプする方法はありますか?
拡張子pythonファイルを使用して、offlineimapに追加の機能を追加できることはわかっていますが、どこから始めればよいかわかりません。
パスワードを知っている状態でofflineimapを実行したままにする別の方法ですが、パスワードをディスクに保存せずに、~/.offlineimaprc
でautorefresh
設定を有効にして、tmux/screenでofflineimapを実行したままにします。
10分ごとにチェックするためには、offlineimaprcファイルのautorefresh = 10
セクションに[Account X]
を追加する必要があります。 password
またはpasswordeval
を含む構成行も削除します。
次に、offlineimapを実行します-パスワードを要求し、メモリにキャッシュします。最初の実行後は終了しませんが、10分間スリープします。その後、起動して再度実行されますが、パスワードは記憶されています。
したがって、offlineimapを使用してtmuxセッションを実行したままにし、パスワードを1回入力すれば、offlineimapはその後正常に動作します。
私は次の方法を使用していますが、これはかなりうまくいきます。
1)パスワードを個別のgpg暗号化ファイルに保存します。たとえば~/.passwd/<accountname>.gpg
2)python拡張ファイルを作成し、次の内容で、選択した名前(例:~/.offlineimap.py
)を付けます:
def mailpasswd(acct):
acct = os.path.basename(acct)
path = "/home/<username>/.passwd/%s.gpg" % acct
args = ["gpg", "--use-agent", "--quiet", "--batch", "-d", path]
try:
return subprocess.check_output(args).strip()
except subprocess.CalledProcessError:
return ""
3).offlineimaprcファイルを変更して、pythonファイルについて通知し、パスワードの読み取り方法を通知します
[general]
pythonfile = ~/.offlineimap.py
# ...
[Repository <reponame>]
# add this line for each remote repository
remotepasseval = mailpasswd("<accountname>")
同時にチェックされる(個別のスレッド)複数のアカウントがあり、gpg-agentを使用する場合、各アカウントのパスフレーズを要求されます。ファイル(echo "prime" | gpg -e -r [email protected] > ~/.passwd/prime.gpg
)を作成してエージェントを準備し、offlineimapの起動時にこのファイルを復号化してgpgエージェントを準備します。これを行うには、以下を~/.offlineimap.py
の末尾に追加します。
def prime_gpg_agent():
ret = False
i = 1
while not ret:
ret = (mailpasswd("prime") == "prime")
if i > 2:
from offlineimap.ui import getglobalui
sys.stderr.write("Error reading in passwords. Terminating.\n")
getglobalui().terminate()
i += 1
return ret
prime_gpg_agent()
@kbetaからの回答を愛する。ただし、subprocess.check_output()
はpython 2.7でのみ導入されたため、古いバージョンのpythonで動作するofflineimap.py
のバージョンは次のとおりです。
import os
import subprocess
def mailpasswd(acct):
acct = os.path.basename(acct)
path = "/home/hamish/.passwd/%s.gpg" % acct
args = ["gpg", "--use-agent", "--quiet", "--batch", "-d", path]
proc = subprocess.Popen(args, stdout=subprocess.PIPE)
output = proc.communicate()[0].strip()
retcode = proc.wait()
if retcode == 0:
return output
else:
return ''