【问题标题】:How to run a script when accessing a specific path?访问特定路径时如何运行脚本?
【发布时间】:2021-12-28 04:53:58
【问题描述】:

我有一些我必须访问的路径,这是安装的结果。

我希望通过脚本自动安装,并且我希望该脚本在由于无法访问路径而引发错误之前运行。

例如,假设脚本是

echo scripting!
mkdir -p /non_existing_path

并且我希望它在尝试(以任何方式)访问路径 /non_existing_path 时运行。

所以当我这样做时

cd /non_existing_path

touch /non_existing_path/my_file.txt

它总是会成功,输出为scripting!。实际上,脚本会比这更详细。


这可能吗?

【问题讨论】:

  • access (in any way) 你将不得不修改 linux 内核来捕获open 系统调用,但你为什么要这样呢? touch "访问" 许多 其他路径 - 请参阅 strace touch - /etc/ld.so.cache /usr/lib/libc.so.6 /usr/lib/locale/locale-archive /usr/share/locale/locale.alias /usr/lib/gconv/gconv-modules.cache 你不想创建它们。我建议围绕使用参数的特定命令编写自己的包装器。
  • @KamilCuk 我可能解释错了。我不想创建它们。我希望脚本仅在访问特定路径时运行。我认为它是在该路径上连接一个钩子或侦听器。
  • 您可以创建一个 fuse 文件系统,自动在该挂载点创建路径。
  • @KamilCuk 你能详细说明一下吗?我不知道 fuse 文件系统是什么或如何做到这一点。
  • 那我相信这与 [bash] 无关,是吗?然后到 [命令行]?

标签: linux bash command-line hook


【解决方案1】:

不确定我是否理解。

  • 即使路径不可访问,您是否希望脚本运行?
  • 您是否希望脚本仅在路径不可访问时运行?
  • 脚本是否应该挂载“不可访问”路径?

无论如何,我认为您应该只使用if else statement

脚本如下所示:

#!/bin/bash

if [ -d "/non_existing_path" ]
then
    bash $1
else
    bash $1
    mkdir -p /non_existing_path
fi

假设这个脚本的名字是“myScript.sh”,而外部脚本的名字是“extScript.sh”。您可以致电:
bash myScript.sh /home/user/extScript.sh

此脚本将检查路径是否存在。
如果是,执行bash /home/user/extScript.sh
如果没有,执行bash /home/user/extScript.shmkdir...

再说一次,我不确定你是否能达到目标,但你可以根据自己的需要进行调整。

【讨论】:

  • 从外部脚本运行无法达到目的。无论调用脚本如何,我都希望你建议的事情发生。我想在文件路径上附加一个钩子。
  • 那么你只需要调用外部脚本作为变量。我编辑了我的答案。
【解决方案2】:

为什么不使用 autofs?

autofs is a program for automatically mounting directories on an as-needed basis.

https://help.ubuntu.com/community/Autofs

【讨论】:

    【解决方案3】:

    是的,重要的情况是调用例如 cd 的第 3 方(例如新的 C 程序、命令行或其他脚本)也应该受到影响,并且他们像往常一样调用 cd,应该事先调用挂钩脚本。

    内核外:

    编写一个可以挂载在其他文件系统之上的 fuse 文件系统,这将在 open() 系统调用上运行 fork()+execve() 自定义脚本。

    在内核中:

    编写将公开/proc/some/interface 的内核文件系统,并在底层现有句柄的“顶部”创建一个文件系统。这样的内核模块将在open() 系统调用时执行一个特殊命令并转发所有其他命令。在open() 系统调用中,内核会将一些数据写入/proc/some/interface 并等待答复。收到答复后,open() 系统调用将继续。

    编写一个用户空间恶魔,例如 poll() 上的事件 /proc/some/interface 等待事件,然后 read() 事件,解析它们并执行自定义脚本。然后在脚本完成后,它会在同一个文件描述符上写入/proc/some/interface,以通知内核模块操作已经完成。

    【讨论】:

      猜你喜欢
      • 2012-02-29
      • 2011-12-26
      • 1970-01-01
      • 1970-01-01
      • 2012-02-17
      • 2021-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多