实时监控目录及子目录并修改子目录及文件的属组及权限
背景
图片上传后到服务器的磁盘上,落盘后的文件,归属用户和属组为应用程序a权限,比如aaa:aaa,且权限是600。这个时候应用程序b也想访问这些图片,该如何授权。
!!!研发要求,不改动代码,运维来实现!!!(无奈表情)(代码不想判断linux还是windows)
思路
1.本人非正规军,但也遵循用户权限最小原则。root先排除。
2.想办法提高落盘图片文件权限
图片权限600改成660
3.修改文件所属组
应该要有个图片专门的属组,比如imagegroup
只要文件目录下的子目录或者文件属组都是imagegroup,属于这个组的用户就可以对该图片进行读写
usermod -aG 用户名
-a (append):这个选项告诉 usermod 不要替换用户的现有附加组,而是将指定的组追加到现有的附加组列表中。
-G (groups):这个选项后面跟着一个逗号分隔的组名列表,用来指定用户应该属于哪些附加组。
通过inotifywait实现
脚本如下:
#!/bin/bash
# 监控的目录
MONITORED_DIR="/path/to/directory"
sudo groupadd imagegroup
sudo usermod -aG imagegroup aaa
sudo usermod -aG imagegroup bbb
# 打印调试信息
echo "开始监控目录: $MONITORED_DIR"
# 使用 inotifywait 监控目录,-m 表示保持运行,-r 表示递归监控子目录
inotifywait -m -r -e create,moved_to,close_write --format '%w%f' "$MONITORED_DIR" | while read NEW_FILE
do
# echo "检测到新文件或目录: $NEW_FILE"
# 检查是否为新文件或目录
if [[ -e $NEW_FILE ]]; then
# 修改文件或目录的所有者和组为 aaa:imagegroup
chown aaa:imagegroup "$NEW_FILE"
# echo "已修改所有者和组为 aaa:imagegroup: $NEW_FILE"
# 如果是文件,则设置权限为 660
if [[ -f $NEW_FILE ]]; then
chmod 660 "$NEW_FILE"
# echo "已设置文件权限为 660: $NEW_FILE"
# 如果是目录,则设置权限为 770
elif [[ -d $NEW_FILE ]]; then
chmod 770 "$NEW_FILE"
# echo "已设置目录权限为 770: $NEW_FILE"
fi
else
echo "无法找到文件或目录: $NEW_FILE"
fi
done
建议与意见
有错误请批评指正
有更好的办法还请指点迷津