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

如何在使用GPG解密文件时实现带进度百分比的进度条功能

方案1:调整GPG参数直接支持管道下输入密码

你原来的写法失败的核心原因是当pv的输出通过管道传给gpg时,gpg默认会从标准输入(也就是管道传来的加密数据流)读取密码,导致密码输入逻辑失效。只需要给gpg添加参数指定从当前终端读取密码即可,修改后的脚本如下:

#!/bin/bash

if [ "$#" -ne 1 ] || ! [ -f "$1" ]; then
  echo "Usage: $0 CIPHERED_FOLDER" >&2
  exit 1
fi

echo "Deciphering $1"
pv "$1" | gpg -d --tty "$(tty)" | tar -xz

这个方案可以直接显示加密文件的读取进度,百分比、剩余时间等信息全部正常显示,密码输入弹窗也会正常弹出在当前终端,不需要提前缓存密码。


方案2:提前触发密码缓存

如果你不想修改gpg的调用参数,可以在执行解密逻辑前先手动触发一次私钥验证,将密码存入gpg-agent缓存,后续解密就不需要再次输入密码,脚本如下:

#!/bin/bash

if [ "$#" -ne 1 ] || ! [ -f "$1" ]; then
  echo "Usage: $0 CIPHERED_FOLDER" >&2
  exit 1
fi

# 触发私钥签名操作唤起密码输入,密码缓存有效期遵循你gpg-agent的配置
gpg --sign /dev/null >/dev/null 2>&1

echo "Deciphering $1"
pv "$1" | gpg -d | tar -xz

补充:显示解密后数据的进度百分比

如果你想要显示解密后数据流的处理进度而非加密文件的读取进度,只需要在加密阶段额外记录原始压缩后的数据大小,解密时传入pv的-s参数即可:

加密参考脚本

#!/bin/bash
if [ "$#" -ne 1 ] || ! [ -d "$1" ]; then
  echo "Usage: $0 SOURCE_FOLDER" >&2
  exit 1
fi
OUTPUT="$1.tar.gz.gpg"
SIZE_FILE="$1.size"
# 压缩加密同时记录原始数据大小
tar -cz "$1" | tee >(wc -c > "$SIZE_FILE") | gpg -e > "$OUTPUT"

对应解密脚本

#!/bin/bash
if [ "$#" -ne 2 ] || ! [ -f "$1" ] || ! [ -f "$2" ]; then
  echo "Usage: $0 CIPHERED_FILE SIZE_FILE" >&2
  exit 1
fi
echo "Deciphering $1"
gpg -d --tty "$(tty)" "$1" | pv -s "$(cat "$2")" | tar -xz

内容的提问来源于stack exchange,提问作者Zone04

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 13:45:02