t
すべての新しいファイルとディレクトリに特定のアクセスマスクがあり、ディレクトリにも固定ビットセット(このディレクトリ内のファイルの削除を制限する固定ビット)があるディレクトリを作成したいと思います。
最初の部分では、親ディレクトリのデフォルトACLを設定する必要があることを理解しました。ただし、新しいディレクトリはt
親ディレクトリからこのビットを継承しません。したがって、所有者でない人もサブディレクトリのファイルを削除できます。この問題を解決できますか?
答え1
グループメンバーシップを許可する構成であり、テスト、グループファイルの作成と変更と同時に、所有者および「他人」を除き、ファイルの削除および名前の変更は許可されません。ユーザー名を使用して、レフそしてumaskが022であると仮定します。
groupadd acltest
usermod -a -G acltest lev
ルートアカウントからログアウトしてレフアカウント。ログインしてルートになるか、以下を使用してください。Sudo:
mkdir /tmp/acltest
chown root:acltest /tmp/acltest
chmod 0770 /tmp/acltest
chmod g+s /tmp/acltest
chmod +t /tmp/acltest
setfacl -d -m g:acltest:rwx /tmp/acltest
setfacl -m g:acltest:rwx /tmp/acltest
ACL は固定ビットを設定できず、固定ビットはサブディレクトリにコピーされません。ただし、以下を使用することもできます。inotifyまたは、ファイルシステムの変更(新しいディレクトリなど)を検出し、それに応じて反応する同様のソフトウェア。
たとえば、Debian では:
apt-get install inotify-tools
次にスクリプトを作成します。inotify、良い/usr/local/sbin/set_sticky.sh
。
#!/usr/bin/env bash
inotifywait -m -r -e create /tmp/acltest |
while read path event file; do
case "$event" in
*ISDIR*)
chmod +t $path$file
;;
esac
done
実行許可根:chmod 0700 /usr/local/sbin/set_sticky.sh
。次に、起動時に(たとえば)/etc/rc.local
または適切なRCファイルで実行します。
/usr/local/sbin/set_sticky.sh &
もちろん、この例では/tmp/acltest
再起動時に消える必要があります。それ以外の場合、これは魅力のように動作します。
答え2
親に基づいて固定ビットを再帰的に設定
固定ビットがないディレクトリは、次の文で見つけることができます。ここで、-
値の前のハイフンは次1000
のように処理する必要があります。この特権値とより高い特権値に一致するプレフィックス。
$ find . -type d \! -perm -1000
setgid
したがって、固定ビットと固定ビットが設定されている親ディレクトリを持つディレクトリを設定する方法は次のとおりです。
find
そうでない場合は、入れ子になった文が必要です。find
ドアは入れ子にすることはできません。。
だから代わりに管路再帰条件を使用すると、固定ビットなしで見つかったディレクトリに使用されます。
-k
テスト固定ビット(この場合は親ディレクトリの固定ビット)が設定されている場合はtrueを返します。
$ find . -type d \! -perm -1000 |while read d; do if [[ -k "$d/.." ]]; then chmod +t,g+s "$d"; fi; done
答え3
次のようにmkdir関数を作成してファイルの末尾に追加できますvi ~/.bashrc
。
mkdir(){
/bin/mkdir "$@"
find . -type d \! -perm -1000 |while read d; do if [[ -k "$d/.." ]]; then chmod +t,g+s "$d"; fi; done
}
-k
オプションは、ここで設定されたGUIDの代わりに固定ビットが設定されていることを確認します。このオプションをg+s
確認してください。man test
または、次のことができます。
unalias mkdir;
source ~/.bashrc
これにより、新しい子ディレクトリに固定ビットを設定する必要がありますが、親ディレクトリに固定ビットが設定されている場合にのみ適用されます。
この方法は効果があるようですが、すべてのユーザーに効果があるかどうかはわかりません!