在 Linux 中,当尝试读取某个目录内不存在的文件时,如何运行程序?

在 Linux 中,当尝试读取某个目录内不存在的文件时,如何运行程序?

我的硬盘上有一个分区,使用 dm-crypt 和密码进行加密。我想要做的是,当某个程序尝试读取此分区目标挂载点内的文件时,弹出密码提示。

例如。我通常将 dm-crypt 卷挂载到目录中/mnt/crypt。挂载后,此目录中有一个“Music”文件夹,其中包含文件 goodmusic.mp3。因此路径为 /mnt/crypt/Music/goodmusic.mp3。

如果我启动 Clementine 并尝试在未安装加密卷的情况下播放此文件,我将收到“找不到文件”错误。

我想要做的是,当 Clementine 尝试打开此目录中的文件 ( /mnt/crypt) 时,弹出一个提示,要求我输入挂载密码并挂载卷。我猜,为了使其正常工作,“读取”系统调用需要在显示密码提示时阻塞,以便读取系统调用不会在我有机会输入密码之前立即报告错误。

这可能吗?

我一直在使用 inotify,但它似乎不支持不存在文件的事件。

答案1

(1)
inotify不报告对不存在文件的访问/读取/写入尝试。
事实上,它们不被视为事件,因为这些文件根本不存在。

(2)

我想要做的是,当 Clementine 尝试打开此目录 (/mnt/crypt) 中的文件时,弹出提示,要求我输入挂载密码并挂载卷。我猜,为了使其正常工作,“读取”系统调用需要在显示密码提示时阻塞,以便读取系统调用不会在我有机会输入密码之前立即报告错误。

这很复杂。一个可能的解决方案是挂接 glibc 的open系统调用并重新定义您自己的版本。您的版本open就像您描述的那样,根据进程尝试访问的文件/目录。

参考:
http://en.wikipedia.org/wiki/Hooking
http://www.gilgalab.com.br/hacking/programming/linux/2013/01/11/Hooking-Linux-3-syscalls/

相关内容