Linux

如何呼叫 chmod 並保留 SGID 位?

  • August 26, 2017

我有以下目錄結構:

+ public/
|-+ pics/
| |-- a
| `-- b
`-+ thumbs/
 |-- a
 `-- b

gallery:http我希望樹中的所有文件都歸ug=rwX,o=模式集所有。

恰好在其中創建目錄pics並以使用者thumbs身份執行的腳本gallerypublic我在和pics上設置了 SUID/SGID 位thumbs

現在的問題是該a目錄將與所有者一起創建gallery:http,但它沒有x該組的權限。如果我呼叫chmod,我將清除 SGID 位。(奇怪的行為,但這確實會發生,可能是因為http不是文件的使用者所有者。)

我不能chown以非 root 使用者的身份先呼叫設置模式,然後再呼叫所有者。

唯一的解決方案似乎是設置umaskug=rwx,o=,創建所有目錄,然後umask在我創建任何正常文件之前更改,或者創建正常文件,然後將它們的模式更改為ug=rw,o=.

有沒有我看不到的更好,更醜的解決方案?

如果您可以更改腳本,那麼將mkdir呼叫更改為mkdir --mode=770.

如果您無法更改腳本,那麼 ACL 可能會有所幫助:

setfacl -m d:u::rwx,d:g::rwx,o::- pics thumbs

umask不對文件設置可執行權限。它從不設置任何權限;它只是防止在文件創建時設置權限。

你有幾個選擇:

  • chmod g+x a
  • 更改 umask
  • 使用訪問控制列表。

是的,您可以在不清除其他位的情況下設置位。見第一個選項。但要使其更加自動化,請執行以下操作之一:

  • 將 umask 設置為 rwxr-x—,並讓每個使用者都有一個私人預設組(他們的主要組只屬於他們)。
  • 使用訪問控制列表:通過這些,您不僅可以為多個組和使用者設置權限,還可以為目錄設置預設值(很像 sgid,但不僅僅是組,還有模式)。請參閱 setfacl、getfacl。另請參閱在 gnu/linux 上設置文件權限等的不同方法是什麼

引用自:https://unix.stackexchange.com/questions/387921