ユーザーの一時ファイルの削除中に権限が拒否されました。

ユーザーの一時ファイルの削除中に権限が拒否されました。

現在のユーザーの一時ファイルを削除し、「許可されていません」エラーが発生した起動時に実行されるスクリプト(まだ何をすべきかわからない)を作成する必要があります。エラーは次のとおりです。

'/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 -lTMPFILEを作成して実行すると、次のような結果が得られます。

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"現在のユーザー要件を統合する方法がわかりません。

私たちはあなたのすべての助けに非常に感謝します

答え1

以下で所有するすべてのファイルを見つけて削除するように指示find /tmp -type f -user $USER -exec rm -f {} \;します。find$USERどこでも /tmp

これで、/tmpルートが所有するサブディレクトリが含まれます。理論的にはできるに属するより多くのファイルが含まれています$USER。したがってfind、そのディレクトリを見つけるためにそのディレクトリを調べようとします。ただし、ルートが所有するディレクトリには権限があるため、drwx------ルートだけがどのような方法でもアクセスできます。

結果は、find入力できないディレクトリを報告し、検索できないことを示します。どこでもしたがって、理論的に/tmpは何かを見逃す可能性があります。

特に指定しない限り、システム起動時に実行されるスクリプトはルートとして実行されるため、システム起動スクリプトで同じコマンドを実行すると、すべてのディレクトリへのフルアクセス権が得られます。/tmpこれはまったく表示されません。問題find:ルートが制御できるため/tmp

ただし、自分のユーザーアカウントで実行している場合は、期待どおりに「許可拒否」エラーを無視するか、最初に$USERアクセス可能なディレクトリを見つけて/tmpからその中のすべてのファイルを削除するより複雑な検索を実行する必要があります。

または、同じスクリプトで生成された一時ファイルのみを見つけるには、ディレクトリ内の一時/tmpファイルを調べることをお勧めします。ただをクリックし、サブディレクトリは無視します/tmp。これを行うには、Googleで使い方が少し難しいです-prunefind

命令trapが若干異なります。これは、スクリプトが常に一時ファイルをクリーンアップしていることを確認するために使用できます(キャッチできない信号(SIGKILLシステムの競合など)が原因で終了しない限り)。 POSIX互換シェルでは、次のように使用できます。

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

このtrapコマンドはEXITコマンドではなく、トラップをトリガーする条件です。条件は信号、特殊値0またはEXIT。どちらの特殊値も「何らかの理由でこのシェルプロセスが終了するたびにこのトラップ操作を実行する必要があります」を意味します。

答え2

次のエラーメッセージを防ぐには

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 {} \;

答え3

いいですね。-atime +33日前のファイルも追加できます。

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

関連情報