Kernighan和Pike的挑战:如何在文件名中添加斜线?


23

我刚刚在Unix编程环境中遇到了以下问题,这是Kernighan和Pike撰写的关于Unix的经典著作(我在1984年第79页的ISBN:0-13-937699-2上找到了以下文本):

练习3-6。(技巧问题)如何将/放入文件名中(即/不会分隔路径的组成部分?)

我作为最终用户和程序员已经使用Linux多年了,但是我无法回答这个问题。有没有办法把斜线的文件名,这是绝对内核禁止。您可以通过块设备访问来修补文件系统,或者使用Unicode中看起来相似的字符,但这不是解决方案。

我知道Linux≠Unix,但是应该应用相同的原理,因为系统必须能够从路径中明确地提取目录层次结构。

有人知道吗,Kernighan和Pike在问这个问题时到底在想什么?答案是什么?“招数”到底是什么?或者也许原始的Unix系统只是被允许以某种方式转义这个斜线?

UPD:

我就此问题联系了Brian Kernighan,他的回答是:

答案是(或者曾经是)“你不能。”

因此,蒂莫西·马丁(Timothy Martin)是对的,得到了​​绿色的勾号。


3
相关的(不是重复的),是有人实际对其进行管理的情况:如何在debugfs的ext4文件系统上删除名为“ filen / ame”(带有斜杠)的文件?
Michael Homer


嗯 也许您可以创建一个包含小写字母的文件,a并强迫您的系统认为该文件系统位于EBCDIC语言环境中?ASCII a为0x61,与/EBCDIC中的代码相对应(代码页37)
Fox

这本书本身是否说这是一个技巧问题?如果是这样,我认为这几乎可以确认您将无法找到一种按设计的方式来做到这一点,而将您已经说过的即用型想法保留下来。
ilkkachu

Answers:


12

也许答案与这个技巧问题的答案相同:
如何获得大象? 你不知道 你从鹅那里得到它。

摘自Brian W. Kernighan和Rob Pike,Ch。的“编程实践”。6,页。158:

当史蒂夫·伯恩(Steve Bourne)编写自己的Unix shell(后来称为伯恩shell)时,他创建了一个254个文件的目录,其中包含一个字符名称,每个字节值一个,除了'\ 0'和斜杠(两个字符)不能出现在Unix文件名中。


3
谢谢你教我这个笑话。它可能可以用作英语流利度测试(我刚刚失败了)。
firegurafiku

你是对的。参见UPD。
firegurafiku

1
@firegurafiku讲笑话
以撒

5

我已经做到了 这是在1980年左右某个时候在PDP-11上运行的UNIX系统上。我创建了一个名为“ WhatXNow?”的文件。然后,我使用二进制文件“编辑器”编辑磁盘设备,并将inode中的“ X”更改为“ /”(卸载了文件系统)。

受害人从未想出如何删除它。

编辑:糟糕,Barmar是对的,我看不到那里的有关不打补丁设备的行。是的,它是我编辑的目录,而不是索引节点。有一阵子了 :-)


1
文件名不在索引节点中,而是在目录特殊文件中。
Barmar

1
我怀疑fsck会删除它。
Barmar

1
问题是您可以通过块设备访问来修补文件系统,或者使用Unicode中看起来相似的字符,但这不是解决方案。这不是您在回答中描述的内容吗?
Barmar '17

@Barmar:嗯,也许我考虑得太深了,修补文件系统是解决方案的初衷吗?我不知道。
firegurafiku

我敢打赌这就是答案。我记得您何时可以读取目录。也许很久以前,root可以写它们。
约书亚

1

/毫无疑问,任何情况下(无需手工操作原始磁盘块)(其值是0x2f的一个字节,而不是一个字符;几乎所有Unix内核都故意忽略了字符编码)都可以进入目录条目的情况内核中的错误。

此类错误有时会发生。我记得读过补丁说明的一个案例是……1990年代的某些迭代……我想说Solaris,但这可能是错误的……为AppleTalk归档协议(AFP)提供了服务器,这相当于经典的MacOS相当于NFS 。问题是,在经典的MacOS上,您完全可以放入/路径名组件。目录分隔符:改为。法新社服务器是应该做的道德等价tr :/ /:映射客户端上的文件的磁盘上提交的路径名的时候,但他们错过了两个代码路径,因为服务器是在内核中实现的,它实际上可以写出不好的目录条目。

(有关上述内容的较长版本,请参阅comp.unix常见问题解答#2.2,该小节以“如果文件名中包含'/',会怎样呢?”开头)。

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.