A と B はどちらも同じグループの root ではないユーザーです。 Bが回帰を実行した後、Bが所有する一部のジャンクファイルがディレクトリに作成されますが(Bが作成して所有しています)、Bの回帰が終了してクリーンアップが正しく実行されない場合は、クリーンアップ操作を実行するにはAが必要ですと仮定します。
私が知る最も簡単な方法は、回帰前にBをumask 0002に設定することですが、残念ながら回帰ツールは何らかの方法でこの設定を無視してBのみを書き込むことができるガベージファイルを生成します。
だから私はこの問題を解決するためにsuid関数を使ってみました。
デモディレクトリは次のとおりです
/proj/ttt> ll
total 0
-rw-r--r-- 1 B users 0 Mar 16 00:50 garbage.file
ジャンクファイルをクリーンアップするために、Bが所有するスクリプト(クリーンアップ)を生成しようとしています。
#!/bin/bash
# cleanup
echo EUID=$EUID UID=$UID
rm -f garbage.file
次に、「chmod ug + s cleanup」を使用してスクリプトにsuidを追加しました。ディレクトリは次のとおりです。
/proj/ttt> ll
total 0
-rwsr-sr-x 1 B users 57 Mar 16 00:50 cleanup
-rw-r--r-- 1 B users 0 Mar 16 00:50 garbage.file
また、親ディレクトリに "s"ビットを追加しました。
drwsr-sr-x 2 B users 4096 Mar 16 00:57 ttt
しかし、このスクリプトをAとして実行すると、's'ビットが機能しなくなり、Aがジャンクファイルを削除できないようです。
/proj/ttt> ./cleanup # executed by A
EUID=25264 UID=25264 # user B's uid is 25220, user A's uid is 25264
rm: cannot remove `garbage.file': Permission denied
私の試みにどのような問題があるのか、それともこのアプローチが最終的にうまくいくのかわかりませんか?
それともこれを行う他のより良い方法はありますか?
答え1
標準的なアプローチは、新しいグループを作成し、そのグループのAとBメンバーの両方を作成し、問題のすべてのファイル(または削除したい場合は少なくともディレクトリ)がそのグループに属していることを確認することです。適切な権限。グループ権限。
グループを権限セットの「ルール」と考えてください。各特殊ルールには通常グループを作成する必要があります。
正しいグループ所有権を適用する1つの方法は、そのグループに属する適切なディレクトリにsetgid(グループ)ビットを設定することです。これにより、このディレクトリに作成されたすべてのファイルが自動的にそのグループに属します。あなたはそうしようとしますが、それがあなたの意図であるかどうかはわかりません。ディレクトリにsetuid(ユーザー)ビットを設定することはできません。
絶対に必要な場合を除き、setuid実行可能ファイルの使用は通常推奨されません。このルートに行きたい場合は、いくつかのアイテムがsudoer
良いかもしれません。