人々が私のスクリプトからシステム上の重要なファイルを誤って削除するのを防ぎたいと思います。そのステートメントを使用してフォルダの所有者を見つける方法を知っている人はいますか?
答え1
find . -prune -user "$(id -u)"
.
現在のディレクトリがあなたの所有者である場合は印刷されます。
次のことができます。
find . -prune -user "$(id -u)" -exec some command \;
または:
if [ -n "$(find . -prune -user "$(id -u)")" ]; then
some command
fi
some command
現在のディレクトリを所有している場合にのみ実行されます。
test
ほとんどの別名実装(別名、別名、別名、および[
シェルに組み込まれている機能の1つを含む)には(大文字のO)もあります。zsh
bash
ksh
dash
yash
bosh
-O
if [ -O . ]; then
some command
fi
シェルには、所有するファイルを選択するためのglob修飾子がzsh
あります。U
したがって、find
次のようなことができます。
if ()(($#)) .(NU); then
some command
fi
現在のディレクトリ所有者であるPOSIXlyのIDを取得するには、次のようにします。
ownerid=$(LC_ALL=C ls -lnd . | awk '{print $3}')
または内蔵zsh
機能を使用してください。stat
stat -LH stat . && ownerid=$stat[uid]
またはGNUを使用してくださいfind
:
ownerid=$(find . -prune -printf %U)
またはGNUを使用してくださいstat
:
ownerid=$(stat -c %u .)
またはBSDの場合stat
:
ownerid=$(stat -f %u .)
この情報があれば、$ownerid
それを使用できるシェルプロセスの有効なユーザーIDと比較できます"$(id -u)"
。一般的に言えば、アカウントデータベース内の各ユーザーIDに対して複数のユーザー名を持つことができるため、ユーザー名ではなくユーザーIDを使用する方が良いです。これにより、ユーザーデータベースを照会する必要がなくなります。
答え2
何を待つ?人が重要なシステムファイルを削除しないようにするには、rootとしてログインしないようにし、スクリプトをsetuidに設定しないようにします。
ユーザーが自分に属していないファイルの管理を支援する場合は、グループ権限を理解し、適切な設定を使用してください。 (あなたが何をしているのかわからないので、これ以上話すことはできません。)
本当にルートアクセスが必要な場合(たとえば、一般ユーザーがシステムログを管理できるようにする場合)、「ホワイトリスト」アプローチを使用してください。スクリプトは、特定の基準を満たすファイルのみを管理する必要があります。それ以外の場合、保護することを忘れる可能性がある重要なリソースが何であるかを誰が知っていますか?