我有一个需要以 root 身份运行的 python 脚本(用于访问带有小触摸屏)。此脚本还需要在密钥服务器上搜索密钥。为了实现此目的,我使用search_keys()
了python-gnupg。
当我使用以下命令执行以下脚本时,它可以正常工作python gpg_test.py
:
import gnupg
gpg= gnupg.GPG(gnupghome="/home/pi/.gnupg")
keyserver= "pool.sks-keyservers.net"
search_string= "[email protected]"
print gpg.search_keys(search_string, keyserver)
这将打印出包含几个键的列表。
但是,如果我使用 运行相同的脚本sudo python gpg_test.py
,我只会得到一个空列表。有人知道这种行为的原因吗?也许有解决方案可以让它在以 root 身份运行时正常工作?
编辑:我查看了 python-gnupg 的源代码,发现的结果search_keys()
包括底层 pgp 调用的 stderr 输出。将 search_keys() 的结果分配给变量result
并调用print result.stderr
会打印以下内容:
gpg: WARNING: unsafe ownership on homedir `/home/pi/.gnupg'
gpg: external program calls are disabled due to unsafe options file permissions
gpg: keyserver communications error: general error
gpg: keyserver search failed: general error
所以在我看来,问题在于我正尝试访问不同用户的 pgp homedir(pi
而不是root
)。
编辑:将所有者更改/home/pi/.gnupg
为 root 解决了这个问题,但这似乎是一个糟糕的“解决方案”。当我想从命令行使用 gpg 时,它还迫使我使用sudo gpg ...
而不是。所以我仍然对更好的解决方案感到好奇!gpg ...
答案1
我在这里回答我自己的问题,以防其他人遇到类似的问题。
root
我的解决方案是使用新的主目录初始化 python-gnupg。由于脚本以 root 身份运行,因此该新主目录现在属于用户。
这样,脚本所做的一切都与我在终端中输入时访问的 gpg 安装无关gpg [command]
。搜索密钥服务器时不会再出现错误。
因此,将上面的 Python 代码改为这样就可以了:
import gnupg
gpg= gnupg.GPG(gnupghome="/home/pi/gnupg_myscript")
keyserver= "pool.sks-keyservers.net"
search_string= "[email protected]"
print gpg.search_keys(search_string, keyserver)