gpt4 book ai didi

带有特殊字符的python 7z密码

转载 作者:太空狗 更新时间:2023-10-30 01:38:16 25 4
gpt4 key购买 nike

我正在尝试使用 7z.exe 解压缩文件,密码中包含特殊字符

例如。 &)kra932(lk0¤23

通过执行以下命令:

subprocess.call(['7z.exe', 'x', '-y', '-ps^&)kratsaslkd932(lkasdf930¤23', 'file.zip'])

7z.exe 启动正常,但它说密码错误。

这是我创建的文件,它让我抓狂。

如果我在 Windows 命令行上运行命令,它运行良好

7z.exe x -y -ps^&)kratsaslkd932(lkasdf930¤23 file.zip

如何让 python 转义 & 字符?


@Wim 问题发生在密码上,因为当我执行

7z.exe x -y -ps^&)kratsaslkd932(lkasdf930¤23 file.zip 

它说无效命令 ')kratsaslkd932(lkasdf930¤23'我使用的是 python 2.76,由于公司工具只能在 2.76 上运行,所以无法升级到 3.x

最佳答案

在命令行传递密码存在很大的安全风险。使用管理权限,可以检索该信息(启动信息对象)并提取密码。更好的解决方案是将 7zip 作为进程打开,并将密码输入其标准输入。

这是将“source.txt”压缩为“dest.7z”的命令行示例:

CMD = ['c:\\Program Files\\7-Zip\\7z.exe', 'a', '-t7z', '-p', 'c:\\source.txt', 'd:\\dest.7z']
PASSWORD = "Nj@8G86Tuj#a"

首先您需要将密码转换为输入字符串。请注意,7-zip 需要在终端中输入密码。您可以使用特殊字符,只要它们可以在您的终端中显示即可。终端的编码很重要!例如,在匈牙利语 Windows 上,您可能希望使用“cp1250”编码。在所有情况下,标准输入都是一个二进制文件,它需要一个二进制字符串(Python 3 中的“bytes”)。如果你想安全起见,你可以将密码限制为纯 ascii 并像这样创建你的输入:

input = (PASSWORD + "\r\n").encode("ascii")

如果您知道终端的编码,则可以将密码转换为该编码。您还可以检测密码是否不能与系统编码一起使用。 (顺便说一句,这也意味着它也不能交互使用。)

(我上次检查时,Windows 上的不同区域设置的终端编码不同。也许有一个技巧可以将其更改为 UTF-8,但我不确定如何。)

这是执行命令的方式:

import subprocess
import typing

def execute(cmd : typing.List[str], input: typing.Optional[bytes] = None, verbose=False, debug=False, normal_priority=False):
if verbose:
print(cmd)
creationflags = subprocess.CREATE_NO_WINDOW
if normal_priority:
creationflags |= subprocess.NORMAL_PRIORITY_CLASS
else:
creationflags |= subprocess.BELOW_NORMAL_PRIORITY_CLASS

if debug:
process = subprocess.Popen(cmd, shell=False, stdout=sys.stdout, stderr=sys.stderr, stdin=subprocess.PIPE,
creationflags=creationflags)
else:
process = subprocess.Popen(cmd, shell=False, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL,
stdin=subprocess.PIPE, creationflags=creationflags)
if input:
process.stdin.write(input)
process.stdin.flush()
returncode = process.wait()
if returncode:
raise OSError(returncode)


CMD = ['c:\\Program Files\\7-Zip\\7z.exe', 'a', '-t7z', '-p', 'c:\\source.txt', 'd:\\dest.7z']
PASSWORD = "Nj@8G86Tuj#a"
input = (PASSWORD + "\r\n").encode("ascii")
execute(CMD, input)

这还展示了如何降低进程优先级(这在压缩大量数据时通常是个好主意),还展示了如何将标准输出和标准错误转发到控制台。

绝对正确的解决方案是加载 7-zip DLL 并使用其 API。 (我没有检查,但可能可以使用 8 位二进制字符串作为密码。)

注意:此示例适用于 Python 3,但同样适用于 Python 2。

关于带有特殊字符的python 7z密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21611328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com