我在 Ubuntu Linux 上有一个程序,它创建一个logs/error.log
具有权限660
( rw-rw----
) 或640
( rw-r-----
) 的文件。但我希望文件权限始终为666
(rw-rw-rw-
)(包括程序创建文件时)。
限制:
- 我无法修改程序。因此,我无法更改
660
程序使用新文件的模式。 - 该程序可以随时重新创建该文件。因此,单一手动执行的解决方案
chmod
并不合适。 - 我需要添加一些权限,但不能减少。因此,
umask
和setfacl
都不适合。
答案1
您可以用来inotify
跟踪文件或目录的创建位置,以便在创建时更新其权限
答案2
如果所有其他更理智的选项都不存在(例如为神秘日志创建程序选择一个合适的用户/组,该程序与您想要从 docker 主机执行的任何操作兼容,或者修改程序的配置以使其使用正确的权限) ),你可以使用这个LD_PRELOAD
技巧:
挂钩您的神秘程序用于创建文件的任何系统调用(可能是creat
或open
,请使用 进行检查strace
)。然后比较文件名,并mode
仅修改您的日志文件。
这需要你知道如何用 C 语言编程。
答案3
最终解决方案在 docker 容器内运行:
#!/bin/bash
cd logs
umask 0
find . -type f -not -name ".gitignore" -exec chmod 666 \{\} \;
inotifywait -rmq -e attrib -e create -e moved_to --format "%w%f" --exclude "/\.gitignore" . | xargs -n1 -d"\n" chmod 666
由于该解决方案设置了世界可写权限,因此不建议按原样使用。尝试寻找另一种使用更安全权限的方法。
感谢 AlexD 的提示!