現在のユーザーの一時ファイルを削除し、「許可されていません」エラーが発生した起動時に実行されるスクリプト(まだ何をすべきかわからない)を作成する必要があります。エラーは次のとおりです。
'/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"
現在のユーザー要件を統合する方法がわかりません。
私たちはあなたのすべての助けに非常に感謝します
答え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で使い方が少し難しいです-prune
。find
命令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 +3
3日前のファイルも追加できます。
find /tmp \( -type d \( -executable -o -prune \) \) -o -type f -atime +3 -user $USER -exec rm -f {} \;