Bash

刪除某個使用者的臨時文件時發現權限被拒絕

  • May 25, 2020

我必須編寫一個在啟動時執行的腳本(這是我還不知道該怎麼做的部分),它會刪除目前使用者的臨時文件,並且出現“權限被拒絕”錯誤。錯誤如下所示:

'/tmp/systemd-private-long number-colord.service-LTsv8G' : permission denied ;
'/tmp/systemd-private-long number-systemd-timesyncd.service-PxhNq0' : permission denied ;
'/tmp/systemd-private-long number-rtkit-daemon.service-KQN6zN' : permission denied

到目前為止,這是我的程式碼:

TMPFILE=$(mktemp)|| exit 1
find /tmp -type f -user $USER -exec rm -f {} \;

如果我ls -l在創建 TMPFILE 後執行,我會得到:

total 4
-rwxrwxrwx 1 bristena bristena 530 may 25 10:51 sh.01

如果我這樣做cd /tmp然後我跑 ls -l我得到

total 12
drwx------ 3 root root 4096 may 25 10:14 systemd-private-long number-colord.service-LTsv8G
drwx------ 3 root root 4096 may 25 10:14 systemd-private-long number-rtkit-daemon.service-KQN6zN
drwx------ 3 root root 4096 may 25 10:14 systemd-private-long number-systemd-timesyncd.service-PxhNq0
-rw------- 1 bristena bristena 0 may 25 10:51 tmp.j0rvQtmz7G

從我在網上看到的我也可以使用trap "rm -f TMPFILE; exit",但我不知道如何整合目前的使用者需求

您的所有幫助將不勝感激

為了避免錯誤資訊

find /tmp -type f -user $USER -exec rm -f {} \;

您可以重定向它們

find /tmp -type f -user $USER -exec rm -f {} \; 2>/dev/null

或防止find遇到該問題:

find /tmp \( -type d \( -executable -o -prune \) \) -o -type f -user $USER -exec rm -f {} \;

find /tmp -type f -user $USER -exec rm -f {} \;告訴你find去查找並刪除所有$USER. /tmp

現在,您/tmp包含由 root 擁有的子目錄。理論上,它們可以包含更多由$USER. 因此find將嘗試查看這些目錄以查找它們。但是 root 擁有的目錄是有權限的drwx------,所以只有 root 才能以任何方式訪問它們。

結果,find將報告它未能進入的目錄,告訴你它無法在下面的任何地方/tmp搜尋,因此理論上它可能遺漏了一些東西。

除非另有說明,否則在系統啟動時執行的腳本將以 root 身份執行,因此如果您在系統啟動腳本中執行相同的命令,它將具有對所有目錄的完全訪問權限,/tmp並且根本不會出現此問題:find因為 root 將能夠對 . 下的所有目錄執行詳盡搜尋/tmp

但是,如果您以自己的使用者帳戶執行它,那麼您將不得不忽略“權限被拒絕”錯誤,因為您期望它們,或者執行更複雜的搜尋,首先查找$USER可以訪問的目錄/tmp,然後刪除其中的任何文件.

或者,如果您只查找由同一腳本創建的臨時文件,那麼您可能只想查看目錄中的臨時文件*,*/tmp而忽略. 如果你想這樣做,Google如何使用; 這有點棘手。/tmp``-prune``find

trap命令略有不同。它可用於確保您的腳本始終清理其臨時文件(除非被無法擷取的信號SIGKILL或系統崩潰等殺死)。在與 POSIX 兼容的 shell 中,您可以像這樣使用它:

TMPFILE=$(mktemp)|| exit 1
trap "rm -f $TMPFILE" EXIT

在這個trap命令中,EXIT不是命令,而是觸發陷阱的條件。條件可以是信號、特殊值0EXIT. 這兩個特殊值都意味著“只要這個 shell 程序出於任何原因退出,就應該執行這個陷阱操作”。

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