刪除某個使用者的臨時文件時發現權限被拒絕
我必須編寫一個在啟動時執行的腳本(這是我還不知道該怎麼做的部分),它會刪除目前使用者的臨時文件,並且出現“權限被拒絕”錯誤。錯誤如下所示:
'/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
不是命令,而是觸發陷阱的條件。條件可以是信號、特殊值0
或EXIT
. 這兩個特殊值都意味著“只要這個 shell 程序出於任何原因退出,就應該執行這個陷阱操作”。