使用Databricks解密test.zip.asc文件失败,寻求技术解决方案
问题描述
有一个包含3个TXT文件的test.zip.asc文件,使用本地工具可正常解密,但通过以下Databricks的Shell脚本解密时失败。
Databricks原代码
%sh #Apply looping for each file in the source folder. for entry in /dbfs/mnt/acc/Temp/* do #Create input variable input=test.zip.asc echo $input #create output variable output=test.zip echo=$output #import private key gpg --no---batch --import /dbfs/mnt/acc/pgp/PrivateKey.asc #start decryption gpg --no--tty --batch --yes --ignore-mdc-error --pinentry-mode=loopback --passphrase-fd 1 --passphrase-file /dbfs/mnt/acc/pgp/Passphrase.txt --output /dbfs/mnt/acc/out/$output --decrypt /dbfs/mnt/acc/input/$input done
执行输出
test.zip.asc
test.zip
gpg:no valid openPGP data found.
gpg:Total number proessed:0
gpg:enrypted with RSA key ,ID A48FAF69A4E7B316
gpg:decryption failed : No secret key
错误原因及修复方案
1. GPG参数语法错误
- 密钥导入命令中的
--no---batch多了一个横杠,应为--no-batch,无效参数导致密钥未成功导入,触发no valid openPGP data found和No secret key错误。 - 解密命令中的
--no--tty多了一个横杠,应为--no-tty。 echo=$output是语法错误,应为echo $output,该错误会导致变量输出异常。
2. 密码参数冲突
解密命令同时使用--passphrase-fd 1(从标准输入读密码)和--passphrase-file(从文件读密码),两个参数冲突,需移除--passphrase-fd 1。
3. 循环未实际生效
脚本中遍历了/dbfs/mnt/acc/Temp/*但未使用循环变量$entry,硬编码了input=test.zip.asc,若要批量处理目录下的文件,需利用循环变量。
4. 路径与权限验证
确保/dbfs/mnt/acc/pgp/PrivateKey.asc和/dbfs/mnt/acc/pgp/Passphrase.txt路径正确,且Databricks运行脚本的用户拥有读取权限;可在导入密钥后添加gpg --list-secret-keys验证密钥是否导入成功。
修复后的代码
%sh # 遍历源目录下的所有.asc加密文件 for entry in /dbfs/mnt/acc/Temp/*.asc do # 使用循环变量作为输入文件路径 input="$entry" echo "正在处理文件: $input" # 自动生成输出文件名(移除.asc后缀) output_filename=$(basename "${input%.asc}") echo "输出文件: $output_filename" # 导入私钥,修复参数错误 gpg --no-batch --import /dbfs/mnt/acc/pgp/PrivateKey.asc # 验证私钥是否成功导入 gpg --list-secret-keys # 执行解密,修复参数冲突与语法错误 gpg --no-tty --batch --yes --ignore-mdc-error --pinentry-mode=loopback \ --passphrase-file /dbfs/mnt/acc/pgp/Passphrase.txt \ --output /dbfs/mnt/acc/out/$output_filename \ --decrypt "$input" done
内容的提问来源于stack exchange,提问作者Rudrashis
相关产品推荐
相关产品推荐

