ファイルを削除するにはsudoが必要ですが、書き込みは許可します

ファイルを削除するにはsudoが必要ですが、書き込みは許可します

すべてのファイルをサーバー RAID 上に保存しており、十分なスペースがあるため、何かを削除する必要はほとんどありません。

常に RAID に書き込みを行っているため、そのために sudo を使用する必要はありません。ただし、書き込みは許可するがファイルの削除は許可しないという権限を設定することは可能ですか?

これにはmvコマンドにsudoを使用する必要があると思いますが、それは問題ではありません。

追加情報:

RAIDはbtrfs raid1を使用します

OSは別のドライブにあります(Ubuntu 14.04サーバー)

答え1

ファイルを作成または削除するには、ディレクトリへの書き込み権限が必要です。ファイルを変更するには、ファイルへの書き込み権限が必要です。

この木について考えてみましょう:

FolderA: (no write permissions for you)
   - FileX (write permissions)
   - FileY (write permissions)

FileX と FileY を変更することはできますが、削除することはできません。また、FolderA に FileZ を作成することもできません。

答え2

それは不可能だと思います。Unix でのファイルの作成と削除は、ディレクトリへの書き込み機能によって制御されます。基本的に同じフラグです。

ここでできることは、書き込み権限のあるディレクトリと、ルートに制限されたディレクトリの 2 つを作成することです。

[romano:~/tmp/test] % ls -l
total 8
drwxrwxr-x 2 romano romano 4096 Oct  8 18:06 normal
drwxrwxr-x 2 root   root   4096 Oct  8 18:06 onlyroot

通常は で作業しますnormal。 に次の内容が含まれているとします。

[romano:~/tmp/test/normal] % ls
one.txt  three.txt  two.txt

明らかにファイルを削除したり、新しいファイルを作成したりできます。たとえば、「 」を削除から保護したいとしますone.txt。これを行うには、 にハード リンクを作成しますonlyroot

[romano:~/tmp/test/normal] 1 % sudo ln one.txt ../onlyroot

one.txtこれにより、に別の名前が作成されますonlyroot(ごくわずかなスペースを使用します。ファイルはコピーされません)。これで、通常のユーザーとしてone.txtフォルダーを削除できますnormalが、その下には変更できないバージョンが残りますonlyroot

[romano:~/tmp/test/normal] % ls
one.txt  three.txt  two.txt
[romano:~/tmp/test/normal] % rm one.txt
rm: remove regular empty file ‘one.txt’? y
[romano:~/tmp/test/normal] % cd ..
[romano:~/tmp/test] % cd onlyroot 
[romano:~/tmp/test/onlyroot] % ls
one.txt
[romano:~/tmp/test/onlyroot] % rm one.txt 
rm: remove regular empty file ‘one.txt’? y
rm: cannot remove ‘one.txt’: Permission denied

答え3

私の理解では(https://btrfs.wiki.kernel.org/index.php/Project_ideas#RichACLs_.2F_NFS4_ACLS)、btrfs は従来の Unix 権限と POSIX.1e ACL のみをサポートしているため、必要な操作を行うことができません。

他の多くの/ほとんどのファイルシステムは、Linux richacls (まだメインラインには入っていないと思います)、NFSv4 ACL、ZFS ACL、または Windows ACL の少なくとも 1 つをサポートしています。これらはすべて、「削除」を明確に拒否することを可能にしますが、これだけのために btrfs の機能を放棄する気があるとは思えません。

一方、単純なエラーを防ぐことを特に意図しているため、autosnap などを使用して btrfs のスナップショット機能を利用した方がよい場合があります。

答え4

1 つの解決策としては、 内に関数を作成することだと思いますbashrc。例:

sudowrapper () { 
sudo -k;sudo "$@";sudo -K; 
}

vimf() {
    echo "pass" | sudowrapper -S nvim "$1"
}

sudowrapper呼び出されるsudoたびに資格情報を忘れさせる必要があります。そうしないと、奇妙な動作が発生します。vimf

自分自身が何か悪いことをしないようにしたい場合にのみこれを行い、他の人が何か悪いことをしないようにすることが目的である場合は、パスワードを書き込むのは.bashrc良い考えではありません。

関連情報