文件名中的换行符


24

我理解并接受这样的前提,即防御性1 shell脚本既审慎又从长远来看更可持续。

在这里,许多文本处理问题的答案都遵循这一原理,将非常规文件名的意外情况纳入了答案。可能包含空格,破折号和换行符。

文件名中的换行有多普遍?特别:

  • 默认情况下,是否有任何应用程序创建包含换行符的文件名?
  • 是否有需要创建此类文件名的情况?
  • 还是它们主要是用户错误的实例?

[1]含义规划和管理最广泛的场景和突发事件...

这个问题是由(颇具争议的)评论引起的


4
简短的答案是,带有换行符和/或不可打印字符的奇怪文件名永远都不是好习惯,明智的应用程序不会创建它们,只有在有人试图破坏您的Shell脚本或无法正确处理此类名称的程序时,您才真正看到它们。我将让其他人通过参考文献等提供更详细的答案。
jw013 2011年

Answers:


26

除了为测试操纵文件名的应用程序而故意创建的文件名外,我从未见过带有换行符的文件名。包含换行符的文件名可能会出现,因为:

  • 某些错误或用户错误(例如,错误的复制粘贴)导致了意外的文件名。
  • 一些文件系统损坏影响了文件名。
  • 有人故意创建一个“奇怪的”文件名来利用安全漏洞,在该漏洞中,应用程序对传递的文件名的信任程度超出了应有的范围。

POSIX将文件名定义为“由1到{NAME_MAX}个字节组成的名称,用于命名文件。可以从除了斜杠字符和空字节之外的所有字符值的集合中选择组成名称的字符。该文件名点和点-点具有特殊的意义。”没有保证每个文件系统将接受‘奇怪’的文件名(只保证字符是ASCII字母,数字,句号,连字符和下划线,即A-Za-z0-9._-,连字符禁止放在第一位),但现代unices上的大多数本机文件系统都可以。


因此spaces,不能保证文件名中的文件名是可移植的吗?如果您弄清楚最后三个字符是,将会很有帮助period, underscore, and hyphen。带有下划线的链接很难分辨。
toxalot

4
@toxalot不,不保证空格是可移植的,也不保证,(RCS使用),:(X.org使用),~(备份文件上的许多程序都使用)……但是,几乎所有现代系统都支持它们。
吉尔斯(Gilles)“所以,别再邪恶了”

22

撰写论文时,我经常从各种来源收集PDF文件的参考书目。并非所有这些文件都包含正确的元数据,这意味着我有时将论文的标题从PDF查看器复制粘贴到文件名中。这通常会导致文件名中出现换行符,但是对于我使用的任何工具,从来都不是问题。

恕我直言,对标准进行编码没有“防御性”。标准指出文件名中允许换行。如果您的脚本未处理标准中允许的所有文件名,则您的脚本已损坏。


2
感谢您提供的真实示例;它很好地强调了您对标准的观点……
jasonwryan 2011年

6
+1表示“如果您的脚本
未处理


⁺¹,由于相同的原因,我偶然发现了此信息!只是想弄清楚如何编写将换行符转换为空格的命令。
Hi-Angel

2

我从未见过NORMAL用户在文件名中使用换行符。看来,它们的主要目的是(1)使攻击者更容易颠覆您的系统,以及(2)使编写安全程序变得更加困难: ,因此,如果您想要一个能够抵抗攻击的程序,则必须为他们做好准备。

“ Shell中的文件名和路径名:如何正确执行”展示了如何正确处理此问题。


我是普通用户,文件名中包含换行符。@sml的答案中所述的情况不止一次发生在我身上。对我来说有趣的是,如何使用文件名中的换行符“颠覆系统”?您是否有任何资料说明这一点?
约瑟夫R.13年

@JosephR。我想不出一种破坏系统的方法,但是您可以将它用作不处理新行的应用程序的DOS(而不是崩溃)
13年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.