Bashスクリプトでファイル権限を設定する

Bashスクリプトでファイル権限を設定する

スクリプトが思ったように動作しません。
すべてのrwx権限をxx5権限に変更するすべてのスクリプトを見つけることができますが、

#!/bin/bash
# the / makes find inclusive


for file in `find . -perm /007 `
do
permissions=`stat -c %a $file`
permissions=${permissions:0:2}5
echo $permissions $file
chmod $permissions $file
done



#find . -perm /007

私の意図は、少なくともいくつかのファイルを保護することです。

答え1

chmod -R o-w .

書き込み権限が削除されます。他の人すべてのファイルを安全に処理してください。ただし、以下を含むすべてのファイルのctimeを更新します。他の人これ以上書き込み権限がありません。

GNUでは、chmod-cオプションを使用して更新が必要なファイルを表示できます。

$ chmod -cR o-w .
mode of `./a' changed from 0777 (rwxrwxrwx) to 0775 (rwxrwxr-x)

ただw削除したい場合他の人彼らがいる場所では、rwx次のことができます。

find . ! -type l -perm -7 -exec chmod o-w {} +

(詳細については-vvGNUまたはFreeBSDを追加してください)。chmodしかし、(特に世界で書くことができるファイルを扱っているので)悪い意図を持つ誰かがそこにあるすべてのディレクトリへの書き込みアクセス権を持っている可能性があり、その間に他のファイルを指すファイルを使用することができる競合状態があるという点で注意してください。代替ファイルを使用findしてこれを確認して実行すると、ファイルへの書き込み権限を削除して混乱を招く可能性があります(chmodたとえば、シンボリックリンクを考えてみてください)。/tmp

GNU構文を使用しているので、GNUであるstat可能性が高いです。 GNUは、GNUが出てくる以前からファイル属性を表示することができたので、両方は必要ありません。findfindfindstat

find . ! -type l -perm -7 -printf '%m %p\n' -exec chmod o-w {} +

答え2

/007には、ownerあなたが持っていない唯一のファイルとの権限が表示されます。groupother

あなたはもっと幸運を楽しむことができます/o=rwx。これはotherファイルの権限とのみ一致します。

正確さのために編集しなさい。

-perm -o=rwxこれは/o包括的なフィルタであり、、、、、または権限のあるotherファイルと一致するため、必ず使用してください。フィルタを排他的に作成してフィールドのファイルのみを一致させるには、フィルタの先行文字をからに変更します。xwxwrrxrwrwx/-rwxother

答え3

あなたのアプローチはパフォーマンス上の悪夢です。各ファイルに対して2つのプロセスを作成します!find情報はすでにそこにあり、簡単に印刷できるため、1つはまったく役に立ちません。より良い解決策は次のとおりです。

find . -perm -o=rwx -printf "%m %p_\0" 2>/dev/null | 
  while read -r -d '' perms path; do
    path="${path%_}"
    echo "${perms} '${path}'" >&2
    printf "%s\0" "$path"
  done | xargs -0 chmod o=rx

関連情報