我在挂载方面遇到了一个奇怪的问题。root 用户无法看到由以 root 身份运行 bash 脚本的 PHP/Apache 创建的挂载。
重现问题的步骤:
为挂载点配置 fstab:
/etc/fstab 文件
/path_to_shared/resource /path_to_local/folder 自动默认值,nofail,nobootwait,bind 0 2
创建一个 Bash 脚本。
- 配置 Apache 以便能够以 root 身份运行 bash 脚本。
- 在 bash 脚本中挂载共享资源:挂载 /path_to_local/folder
配置 apache 以便能够以 root 身份运行脚本的步骤:
- 维苏多
- www-数据 ALL=(全部) NOPASSWD: /path_to_script/script.sh *
然后我从 PHP/Apache 运行脚本(/path_to_script/script.sh)。
当脚本完成后,root 无法看到已挂载文件夹 (/path_to_local/folder) 内的已挂载资源 (/path_to_shared/resource) 的内容。
如果我以 root 身份手动运行相同的命令,那么 root 就可以看到挂载内容。但是当通过 Apache 运行该命令时,root 无法看到挂载的内容,而 Apache 可以看到挂载的内容。
示例 1:
在此示例中,Apache 用户能够看到使用 bash 脚本挂载的文件夹的内容。
PHP/Apache 获取目录列表:
scandir(“/path_to_local/folder”)
显示 /path_to_shared/resource 的内容。
示例 #2:
在此示例中,root 用户无法看到 Apache 挂载的文件夹的内容。
root@server〜: ls -al / path_to_local /文件夹
不显示任何文件夹内容。
示例 3:
在此示例中,root 用户手动运行 mount 命令。执行此操作后,root 用户可以看到挂载。此示例用于说明从命令提示符以 root 身份运行的相同命令是否有效。
root@server~: 挂载 /path_to_local/folder
root@server〜: ls -al / path_to_local /文件夹
显示 /path_to_shared/resource 的内容。
附加更新
我找到了原因,但我不知道合适的解决方案是什么。显然,Apache 将 PrivateTmp 设置设置为 true。如果我将其设置为 false,它就会按我的预期工作。但是,这样做显然会给我带来 /tmp 文件夹的安全问题。我找到的信息来自类似的问题/答案:https://stackoverflow.com/questions/32869660/bind-mount-not-visible-when-created-from-a-cgi-script-in-apache。
我更愿意实时创建挂载,而不是等待 crontab 事件。除非我能想出实时解决方案,否则我将从 Apache 脚本中删除挂载命令,并使用 crontab 事件创建挂载。