有些函数不需要指定 GPG 主目录(即 ~/.gnupg)之外的任何内容,但其他函数需要的远不止这些。尤其是在您操作钥匙圈时。
我通过在与我的其他脚本相同的目录中创建一个 config.py 文件来解决这个问题:
homedir = "/Users/username"
gpg_home = homedir+"/.gnupg"
gpg_homeshort = "~/.gnupg" # optional
pub_ring = gpg_home+"/pubring.gpg"
sec_ring = gpg_home+"/secring.gpg"
pring = []
sring = []
pring.append(pub_ring)
sring.append(sec_ring)
对于 OS X,对于 Linux、BSD 和其他 UNIX,将第一行更改为:
homedir = "/home/username"
对于具有基本加密和解密的脚本,这应该可以工作:
import gnupg
from config import *
gpg = gnupg.GPG(gnupghome=gpg_home)
使用详细参数会导致:
>>> gpg = gnupg.GPG(gnupghome=gpg_home, verbose=True)
gpg --status-fd 2 --no-tty --homedir /Users/username/.gnupg --version
>>>
较短的形式导致:
>>> gpg = gnupg.GPG(gnupghome=gpg_homeshort, verbose=True)
gpg --status-fd 2 --no-tty --homedir '~/.gnupg' --version
>>>
对于搜索默认密钥环的脚本,这应该可以工作:
import gnupg
from config import *
gpg = gnupg.GPG(gnupghome=gpg_home, keyring=pring, secret_keyring=sring)
gpg.encoding = "latin-1"
pkeys = gpg.list_keys(False)
skeys = gpg.list_keys(True)
注意字符编码的变化,这是为了防止在读取某些可能包含奇怪键的密钥环时出错(如果您将其保留为“UTF-8”,可能会或可能不会破坏脚本)。这将导致 pkeys 和 skeys 被创建为列表,其中每个条目都包含密钥环中每个键的字典。
详细形式导致:
>>> gpg = gnupg.GPG(gnupghome=gpg_home, keyring=pring, secret_keyring=sring, verbose=True)
gpg --status-fd 2 --no-tty --homedir /Users/username/.gnupg --no-default-keyring --keyring /Users/username/.gnupg/pubring.gpg --secret-keyring /Users/username/.gnupg/secring.gpg --version
>>>
简写结果为:
>>> gpg = gnupg.GPG(gnupghome=gpg_homeshort, keyring=pring, verbose=True)
gpg --status-fd 2 --no-tty --homedir '~/.gnupg' --no-default-keyring --keyring /Users/username/.gnupg/pubring.gpg --version
>>>
很可能操纵路径以使用替代密钥环或可能的相对路径以实现可移植实现。
无论如何,这里有一个关于钥匙圈的快速演示(假设与上面相同的配置文件):
import gnupg
from config import *
gpg = gnupg.GPG(gnupghome=gpg_home, keyring=pring, secret_keyring=sring)
gpg.encoding = "latin-1"
pkeys = gpg.list_keys(False)
skeys = gpg.list_keys(True)
pnum = len(pkeys)
snum = len(skeys)
print("""
%s contains %d public keys
%s contains %d private keys
""" % (pub_ring, pnum, sec_ring, snum))