gpt4 book ai didi

python - 跨平台,安全使用命令行字符串分隔符

转载 作者:太空狗 更新时间:2023-10-29 22:29:24 28 4
gpt4 key购买 nike

对于 PyInstaller 中的新功能,我们需要一个命令行选项来接收其中包含任何分隔符的字符串。这是讨论:https://github.com/pyinstaller/pyinstaller/pull/1990 .

例子:

pyinstaller --add-data="file.txt?dir"

?是这里的分隔符,这应该是另一个字符。 不能保证,字符串被引号!

我们考虑过; : > < | *等等,但我们无法弄清楚要保存哪个字符以供使用,没有副作用且平台独立(希望路径中不允许)。 >例如将重定向标准输出,;是 POSIX ect 上的命令分隔符。

知道我们可以使用什么角色吗?

最佳答案

真正的问题及其解决方案

您的问题是 XY problem 的一个实例在某种程度上。至少一条红鲱鱼。

如下所示,不存在理想的路径定界符,因此如果您真的坚持支持任意疯狂的路径,您必须在单独的命令行选项中传递该信息。然后,由用户决定在调用您的程序时在路径中转义他们的怪异字符。

不存在理想的路径分隔符

Unix 路径可以包含除 ASCII NUL (\0) 之外的任何字符。路径组件(文件名)不允许包含斜线(/)。其他都可以,according to POSIX .

因此,您选择的约束太紧了。即使在 Unix 上也不存在解决您的问题的理想解决方案,完全忽略了可移植性问题。

好的路径分隔符

您必须对路径施加一些“常识”约束,例如那they will not contain semicolon on Windows and colon on Unix .这种组合非常自然、直观且易于阅读,顺便说一下,因为这些字符是 path separators对于这些系统。

让我们看看是否可以只保留一个可能永远不会出现在路径中的字符。那么这组约束是否可以满足?

如果您列出非字母数字可打印 ASCII 字符并删除那些对 Unix shell 具有特殊意义的字符以及那些即使是理智的人也在路径中使用的字符(_、- 等),您可以选择一个合理的路径分隔符:

LC_ALL=C
awk 'BEGIN{ for (i=1;i<ARGC;i++) printf "%c\n", ARGV[i]; }' {1..127} |
grep '^[[:print:]]$' |
grep '^[^][*?~$`"'\''&|#\<>(){}!;/[:alnum:] ._-]$'

ASCII 是 0..127,但 0 被排除在外,因为它会给面向文本的实用程序带来麻烦。 Bash 特价商品也被过滤掉了。

虽然结果集只包含七个字符:%+,:=@^

啊哈,百分比 (%) 和插入符 (^) 不幸的是在 cmd.exe 和冒号 (: ) 在 Windows 路径中。只剩下四个:+,=@

要么你选择其中之一,要么你认为它们不方便,然后修改特殊列表以针对不同的系统选择不同的字符(例如,你建议的冒号和分号妥协),这稍微放宽了可移植性限制。或者也许波浪号 (~) 在 shell 中并不那么特殊,因为它仅在 shell 单词开头扩展到主目录路径。或者您可能不需要分隔符,而是分隔符字符串——您可以猜到很少有文件的名称中包含 @@@

关于python - 跨平台,安全使用命令行字符串分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37304799/

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