GPG 암호화 파일을 통해 인증하기 위해 OfflineIMAP을 설정하려고 합니다(모든 암호화를 gpg-agent 프로세스에 통합할 수 있도록).
문서에 따르면 서버 비밀번호를 암호화하는 유일한 방법은 gnome-keyring을 사용하는 것입니다(헤드리스 서버에서는 이것을 실행하고 싶지 않습니다). mutt를 사용하는 것처럼 gpg 파일에서 비밀번호를 입력하는 방법이 있나요?
Python 파일 확장자를 사용하여 오프라인 지도를 사용하여 추가 기능을 추가할 수 있다는 것을 알고 있지만 어디서부터 시작해야 할지 모르겠습니다.
답변1
나는 아주 잘 작동하는 다음 방법을 사용합니다.
1) 비밀번호를 별도의 GPG 암호화 파일에 저장하세요. 예를 들어~/.passwd/<accountname>.gpg
~/.offlineimap.py
2) 다음 내용을 포함하여 원하는 이름(예: )으로 Python 확장 파일을 만듭니다 .
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를 사용하는 경우 각 계정의 비밀번호를 묻는 메시지가 표시됩니다. 파일()을 생성하여 에이전트를 시작하고, 오프라인 지도가 시작되면 파일을 복호화하여 gpg 에이전트를 시작합니다. 이렇게 하려면 끝에 다음을 추가하세요.echo "prime" | gpg -e -r [email protected] > ~/.passwd/prime.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()
답변2
암호를 알고 있지만 디스크에 암호를 저장하지 않고 Offlineimap을 실행하는 또 다른 방법은 Offlineimap을 tmux/screen에서 실행하고 autorefresh
파일에서 이 설정을 활성화하는 것입니다.~/.offlineimaprc
10분마다 확인하도록 오프라인imaprc 파일 autorefresh = 10
에 섹션을 추가해야 합니다 . [Account X]
또한 password
또는 를 사용하여 구성 줄을 제거합니다 passwordeval
.
그런 다음 오프라인imap을 실행하십시오. 비밀번호를 묻고 메모리에 캐시합니다. 첫 번째 실행 후에는 종료되지 않지만 10분 동안 절전 모드로 전환됩니다. 그런 다음 깨어나서 다시 실행되지만 여전히 비밀번호를 기억합니다.
따라서 오프라인 매핑으로 실행 중인 tmux 세션을 그대로 두고 비밀번호를 한 번 입력한 후 오프라인으로 매핑할 수 있습니다.
답변3
@kbeta의 답변처럼요. 그러나 subprocess.check_output()
Python 2.7에서만 도입되었습니다. 따라서 offlineimap.py
이전 버전의 Python에서 작동하는 버전은 다음과 같습니다.
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 ''
답변4
ArchLinux 위키에는 다음과 같은 내용이 있습니다.좋은 정보.
아래와 같이 KDE 지갑에 비밀번호를 저장할 수 있습니다이 가이드.
~/offlineimaprc
[general]
accounts = main
pythonfile = ~/offlineimap.py
[Account main]
# Identifier for the local repository; e.g. the maildir to be synced via IMAP.
localrepository = main-local
# Identifier for the remote repository; i.e. the actual IMAP, usually non-local.
remoterepository = main-remote
[Repository main-local]
# OfflineIMAP supports Maildir, GmailMaildir, and IMAP for local repositories.
type = Maildir
# Where should the mail be placed?
localfolders = ~/imap-backup
[Repository main-remote]
type = IMAP
sslcacertfile = /etc/ssl/certs/ca-certificates.crt
remotehost = my.host
remoteuser = my.user
remotepasseval = get_password()
~/offlineimap.py
#! /usr/bin/env python2
from subprocess import check_output
def get_password():
return check_output('qdbus org.kde.kwalletd5 /modules/kwalletd5 readPassword "$(qdbus org.kde.kwalletd5 /modules/kwalletd5 org.kde.KWallet.open kdewallet 0 "kde-service-menu-nowardev-scanner")" "imap" "akonadi_imap_resource_0rc" "kde-service-menu-nowardev-scanner"', shell=True).splitlines()[0]