我理解并接受这样一个前提:防御性1 shell 脚本既是谨慎的,而且从长远来看,也更可持续。
这里的许多文本处理问题的答案都遵循这一原则,将非正统文件名的意外情况纳入答案中;可能包含空格、破折号和换行符。
文件名中的新行有多普遍?具体来说:
- 是否有应用程序创建默认包含换行符的文件名?
- 是否存在需要创建此类文件名的情况?
- 或者它们主要是用户错误的一个例子?
[1] 意味着规划和管理尽可能广泛的场景和突发事件......
问题受到(相当哀伤的)评论的启发这个问题。
答案1
我从未见过带有换行符的文件名,除非是专门为测试操作文件名的应用程序而创建的文件名。包含换行符的文件名可能会出现,因为:
- 某些错误或用户错误(例如错误的复制粘贴)导致了意外的文件名。
- 某些文件系统损坏影响了文件名。
- 有人故意创建一个“奇怪”的文件名来利用安全漏洞,其中应用程序对所传递的文件名的信任程度超过了应有的程度。
POSIX 定义了一个文件名作为“由 1 到 {NAME_MAX} 个字节组成的名称,用于命名文件。组成名称的字符可以从除了斜杠字符和空字节之外的所有字符值的集合中选择。文件名“点”和“点-点”具有特殊含义。”不能保证每个文件系统都会接受“奇怪的”文件名(唯一的)保证字符是ASCII 字母、数字、句点、连字符和下划线,即A-Z
,a-z
,0-9
和._-
,连字符禁止出现在第一个位置),但现代 unice 上的大多数本机文件系统都是这样做的。
答案2
在撰写论文时,我经常从各种来源收集 PDF 文件的参考书目。并非所有这些都包含正确的元数据,这意味着我有时会将 PDF 查看器中的论文标题复制粘贴到文件名中。这通常会导致文件名中出现换行符,但对于我使用过的任何工具来说都不是问题。
恕我直言,按照标准进行编码没有任何“防御性”。该标准规定文件名中允许使用换行符。如果您的脚本不能处理标准中允许的所有文件名,那么您的脚本就会损坏。
答案3
我从未见过普通用户在文件名中使用换行符。看来它们的主要目的是 (1) 让攻击者更容易颠覆您的系统,以及 (2) 让编写安全程序变得更加困难:-(。但是,现代的类 Unix 系统(例如 Linux)允许它们,所以如果你想要一个能够抵抗攻击的程序,你就必须为它们做好准备。
“Shell 中的文件名和路径名:如何正确执行”展示了如何正确处理这个问题。