Linux
如何呼叫 chmod 並保留 SGID 位?
我有以下目錄結構:
+ public/ |-+ pics/ | |-- a | `-- b `-+ thumbs/ |-- a `-- b
gallery:http
我希望樹中的所有文件都歸ug=rwX,o=
模式集所有。恰好在其中創建目錄
pics
並以使用者thumbs
身份執行的腳本gallery
。public
我在和pics
上設置了 SUID/SGID 位thumbs
。現在的問題是該
a
目錄將與所有者一起創建gallery:http
,但它沒有x
該組的權限。如果我呼叫chmod
,我將清除 SGID 位。(奇怪的行為,但這確實會發生,可能是因為http
不是文件的使用者所有者。)我不能
chown
以非 root 使用者的身份先呼叫設置模式,然後再呼叫所有者。唯一的解決方案似乎是設置
umask
為ug=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 上設置文件權限等的不同方法是什麼