You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 19:15:03