當我沒有設定它時 chmod 允許寫入

當我沒有設定它時 chmod 允許寫入

我有一個 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::rwxdefault: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將為您提供更大的靈活性,例如以不同的方式對待目錄和常規文件。

相關內容