誤ってディレクトリでchmod -R + xを使用しました。正しい権限を復元する方法は?

誤ってディレクトリでchmod -R + xを使用しました。正しい権限を復元する方法は?

まあ、具体的にはそうですchmod -R 755。これですべてのファイルが実行可能になりました。私はこれをしたくありません。各ファイルの最初の2バイトを調べる必要があるようですが#!、それはすべてを扱うことができますか?fileすべてを見て、それに応じて決定を下す必要がありますか?それとももっと良い方法がありますか?

ディレクトリを再帰的に巡回し、実行可能でないファイルに-xを設定する最善の方法は何ですか?

答え1

ここには魔法の弾丸はありません。権限によって伝達される情報が常に重複するわけではありません。

システムディレクトリでこれを行うと、setuidビットとsetgidビット、および誰でも読み取れないファイル、グループ、またはグループである必要があるファイルについて心配する必要があるため、システムは非常に悪い状態になります。グローバルに書き込み可能です。

各ユーザーのディレクトリでは、誰もが読めないファイルについて心配する必要があります。あなたを助ける人は誰もいません。

執行可能性に関しては、執行不可能に見えるものはすべて執行不能にしておくのが良い経験則です。カーネルは、最初の2バイトが#!12のバイトのELFバイナリ、値が12のバイトのELFバイナリ、およびいくつかのまれなファイルタイプ(a.out、登録されているすべてのファイルタイプ)を実行できます。したがって、次のコマンドは権限を合理的な状態に復元する必要があります(bash 4またはzshを想定し、そうでない場合はディレクトリツリーをナビゲートする場合は警告、ブラウザに直接入力します)。\x7fELF\x7fbinfmt_miscfind

for x in **/*; do
  if ! [ -f "$x" ]; then continue; fi # skip all but regular files
  case $(head -c 4 "$x") in
    "#!"??) :;; # skip script
    "\x7fELF") :;; # skip ELF executable
    *) chmod a-x "$x";;
  esac
done

ACL をサポートできる Linux およびその他の unices では、ディレクトリツリーに対する権限を簡単にバックアップおよび復元する方法があります。

getfacl -R >saved-permissions
setfacl --restore=saved-permissions

答え2

私はあなたが次のようなことをしたいと確信しています

find dir -type f -exec chmod ugo-x '{}' +

これにより、dirはすべての一般的なファイル(ディレクトリとデバイスを除く)を繰り返し検索し、実行可能ビットを削除します。

ここから始めて実行可能なファイルを作成しましょう。

以下は要求どおりに正しく機能する必要があります(すべての一般的なファイルを見つけて、そのファイルで#!を見つけて、見つからない場合はxビットを削除します)。

find . -type f | xargs grep -L #! | xargs chmod ugo-x

それはおそらく上記のバージョンよりも良いバージョンです(パイプの数が少ない)。

find . -type f -exec grep -L #! '{}' + | xargs chmod ugo-x 

答え3

Shebang行がない場合、ファイルは名目上/bin/sh。多くのリスク。 Shebang行を含むファイルが実行ビットが設定されていることを意味しないという誤解が発生する可能性がありますが、ディレクトリの内容の目的に関する追加情報がない場合、これが自分の存在に問題があるかどうかを判断できます。システムおよび/またはデータに対する脅威。grepchmod

関連情報