實時監控目錄及子目錄並修改子目錄及檔案的屬組及許可權

海yo發表於2024-09-27

背景

圖片上傳後到伺服器的磁碟上,落盤後的檔案,歸屬使用者和屬組為應用程式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

建議與意見

有錯誤請批評指正
有更好的辦法還請指點迷津

相關文章