Azure Databricks运行PGP加密代码时gnupghome目录访问问题咨询
报错根因
gnupg组件要求传入的gnupghome参数必须是已存在、且当前执行用户有读写权限的目录。Azure Databricks集群的默认执行用户无/root目录的访问权限,你指定的/root/.pnugp路径不存在,因此触发该报错。
修复方案
按照以下步骤调整代码即可正常运行:
- 改用Databricks集群节点本地可读写的
/tmp目录作为gnupg工作目录,执行前先判断目录是否存在,不存在则创建,同时设置目录权限为700(gnupg对工作目录权限有严格要求,权限过宽也会触发异常) - 加密后的输出文件如果需要持久化存储,不要写入节点本地临时路径,需指定
/dbfs/开头的挂载路径避免集群重启后文件丢失
修改后完整代码
import gnupg from pprint import pprint import os # 定义gnupg工作目录,放在节点临时目录下 gpg_home = "/tmp/.gnupg" # 目录不存在则创建,设置权限为700 if not os.path.exists(gpg_home): os.makedirs(gpg_home, mode=0o700) else: os.chmod(gpg_home, 0o700) # 初始化gpg时传入正确的工作目录 gpg = gnupg.GPG(gnupghome=gpg_home) key_data = open("/dbfs/mnt/xxxx/SCO/oracle/xxx/Files/publickey.asc").read() import_result = gpg.import_keys(key_data) pprint(import_result.results) # 加密后输出到DBFS持久化路径 output_path = "/dbfs/mnt/xxxxx-storage/SCO/oracle/xxx/Files/my-encrypted.txt.gpg" with open("/dbfs/mnt/xxxxx-storage/SCO/oracle/xxx/Files/FileToEncrypt.txt",'rb') as f: status = gpg.encrypt_file( f, recipients=['securxxxxfertuca@xx.ca'], output=output_path) print( 'ok: ', status.ok) print ('status: ', status.status) print ('stderr: ', status.stderr)
注意事项
- 集群重启后节点本地
/tmp目录内容会自动清空,因此每次运行脚本都会重新创建工作目录、导入公钥,属于正常情况。如果需要持久化保存gnupg工作目录,可将gpg_home改为/dbfs/下的路径,首次创建时同样需要设置权限为700。 - 原代码中公钥、待加密文件的
/dbfs/开头路径无需修改,只要存储挂载配置正常即可正常读取。
内容的提问来源于stack exchange,提问作者Marian
相关产品推荐
相关产品推荐

