我有一個 perl 腳本,可以系統地更改權限。該腳本所做的第一件事是刪除所有權限。它透過呼叫chmod
(從 perl)來完成此操作。我這樣做是因為我發現設定的 guid 位元不會清除,除非我明確清除它:
system('find',
$topdir,
'-exec', 'chmod', 'u-swrx,g-swrx,o-swrx', '{}', ';'
);
我為群組和目錄設定了不同的權限。使用find
,我從 perl 中調用它,如下所示(在本例中為目錄):
system(
'find',
$topdir,
'-type', 'd',
'-exec', 'chmod', 'g=rx', '{}', ';'
);
現在,即使我只設定了 rx,當我在腳本執行完成後檢查檔案權限時,腳本似乎具有 rwx。有什麼我應該注意的嗎,因為我不太明白為什麼會發生這種情況;我沒有在任何地方明確設置它。我也設定了 ACL,但它們的行為都符合預期。當我檢查 getfacl 時,我看到的唯一值得注意的是mask::rwx
和default:mask::rwx
。這可能是導致問題的原因嗎?
答案1
查看錯誤輸出:您應該看到find: `…' Permission denied
錯誤。您要做的第一件事是刪除 的所有存取權限$topdir
,這可以防止進一步遞歸到其中。chmod
除了第一個命令之外,您期望的命令都不會執行。
如果要刪除存取樹中所有目錄的權限,則需要從內到外進行操作。否則,一旦您脫離了父目錄,就無法再遞歸到該目錄。
system('find',
$topdir,
'-depth',
'-exec', 'chmod', 'u-swrx,g-swrx,o-swrx', '{}', ';'
);
由於您使用的是 Perl,因此請使用File::Find
而不是呼叫外部程式find
。使用該finddepth
函數獲得正確的遍歷順序。
進行兩次遍歷似乎沒有意義。相反,進行一次遍歷並直接將檔案權限設定為您想要的,例如chmod 0750
或任何應該設定的權限。使用File::Find
將為您提供更大的靈活性,例如以不同的方式對待目錄和常規文件。