1

假设我们在不同位置有多个不同版本的同一文件夹,如下所示:

  • /in/some/location/version1
  • /different/path/version2
  • /third/place/version3

它们的每个版本都包含callerFile,这是一个预编译的可执行文件,我们无法控制其工作功能。这callerFile将创建并编辑一个名为cache

  • /some/fourth/destination/cache

所以我们在每个版本的设置之间都有矛盾,所以我想做的是将 转换为/some/fourth/destination/cache具有 3 个不同目的地的链接

  • /some/fourth/destination/cache-->/in/some/location/version1/cache
  • /some/fourth/destination/cache-->/different/path/version2/cache
  • /some/fourth/destination/cache-->/third/place/version3/cache

例如:

  • 如果/in/some/location/version1/callerFile调用/some/fourth/destination/cache它应该重定向到/in/some/location/version1/cache
  • 如果/different/path/version2/callerFile调用/some/fourth/destination/cache它应该重定向到/different/path/version2/cache
  • 如果/third/place/version3/callerFile调用/some/fourth/destination/cache它应该重定向到/third/place/version3/cache

那么,如何在 Ubuntu 12.04 64 位操作系统上执行此操作?

4

1 回答 1

2

假设您无法控制 callerFile 实际执行的操作,我的意思是它执行所需的操作并且始终相同,因此结论是您需要修改它的环境。这将是一个相当高级的技巧,需要对 Linux 内核和一般的 Unix 编程有深入的经验,你应该考虑一下是否值得。它还需要在您的 callerFile 二进制文件所在的机器上具有 root 权限。

我建议的解决方案是创建一个可执行文件(或调用 exec() 系列函数之一的脚本),它将基于“mount -o bind”或 unshare( ) 系统调用。

就像说的那样,玩所谓的“执行上下文”是相当高级的把戏。从理论上讲,您也可以尝试一些类似 autofs 的解决方案,但是您最终可能会得到相同的结果,并且 bindmount/unshare 可能比某些 FS 检测守护程序更有效。出于同样的原因,我不建议深入 FUSE。并且玩一些带有符号链接的过于复杂的游戏可能也不是办法。

http://www.kernel.org/doc/Documentation/unshare.txt

注意:无论“callerFile”二进制文件做什么,我很确定它不会检查自己的文件名,这使得可以用中间的其他东西替换它,这将在“callerFileRenamed”上执行 exec()。

据我了解,基本上您想要的是使用相同的活动获得不同的结果,以活动本身外部的某些条件来区分,例如,根据用户的 UID,在同一目录中为“ls”返回不同的列表谁发出“ls”命令,而不修改一些 ./ls 程序二进制文件。

于 2012-10-02T11:03:33.007 回答