如何在使用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
相关产品推荐
相关产品推荐

