ディレクトリで誤って-R + xをchmodしました。正しい権限を復元するにはどうすればよいですか?


20

まあ、具体的には、そうでしたchmod -R 755。これで、すべてのファイルが実行可能になりましたが、これは望ましくありません。の各ファイルの最初の2バイトを調べる必要があると考えていますが、#!これですべてがカバーされますか?代わりにfile、すべてを調べて、その決定に基づいて判断する必要がありますか?または、これを行うためのより良い方法はありますか?

再帰的にディレクトリを通過し、「実行可能」でないファイルに-xを設定する好ましい方法は何ですか?


/または別のディレクトリでこれを行いましたか?
gvkv

1
@gvkv:で/はありません。完全に私が所有するディレクトリです。
ラリー・王

1
将来、@ Larryは、おそらくすべてのパーミッションを強要し、すべてのファイルに書き込みを引き起こすのではなく、+ xのバリアントを使用する必要があります。
xenoterracide

@xenoterracide:同意しました。私が本当に欲しかったのは、グループと同じ許可を与えることでした(最終的には起こりました!)、入力する前に十分な思考をしていませんでした。
ラリー・王

何個のファイルについて話していますか?いくつ実行可能にすべきですか?ファイル名から判断する方法はありますか?
デイヴィッドソーンリー

回答:


15

ここには魔法の弾丸はありません。許可には、常に冗長ではない情報が含まれています。

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

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

実行可能性に関しては、実行可能なように見えないすべてのものを非実行可能にすることをお勧めします。カーネルは、その最初の2つのバイトしているスクリプトを実行することができ#!、その最初の4バイトですELFバイナリ値12、およびいくつかのまれなファイルの種類(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

Linuxおよび場合によってはACLをサポートする他のユニックスでは、ディレクトリツリーの権限をバックアップおよび復元する簡単な方法があることに注意してください。

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

ありがとう!幸いなことに、すべてがこれら2つのカテゴリに分類されると思います。これが何かを逃した場合、後で対処できます。
ラリー・王

**/*必要とすることに留意してくださいglobstar
クリスダウン

このスクリプトには2つの変更をお勧めします。1つfindは、globstarではなく使用します。2つ目は、頭を見る代わりに、fileコマンドを使用してそれが何であるかを確認し、そこから分岐します。
シャドゥール

@Shadurはfindより信頼性が低いglobstarglobstarほとんどすべての場合に好適です。
クリスダウン

1
@Gilles「お持ちの場合、はるかに優れている」などのように、高速であるだけでなく、信頼性も高い(および予期しないSNAFUがない)ので好ましい。
クリスダウン

6

あなたは次のようなものが欲しいと思う

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

これは、ディレクトリ内で再帰的にすべての通常のファイルを検索し(ディレクトリとデバイスを除外)、実行可能ビットを削除します。

ここから始めて、実行可能、実行可能になっているはずのファイルを作成する方法に取り組みます。

以下はあなたが求めたとおりに動作するはずです(すべての通常ファイルを見つけ、#!でgrepし、見つからない場合はxビットを削除します)

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

おそらく上記のより良いバージョン(パイプが少ない)

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

3
ことを確認しgrep -L '^#!'、少なくとも(引用符が必要であり、^行の先頭にマッチングに限ります)、それが一致したとして、それはあまりにも寛容まだです#!任意の行に。xargsスペースまたは引用符を含むファイル名では使用に失敗します。使用xargs -d '\n'(GNUが必要xargs)。
ジル「SO-悪であるのをやめる」

0

さて、シェバン行がなければ、ファイルはシェルスクリプトとして実行されます/bin/sh。あなただアイデアは良いスタートと問題のディレクトリがあり、ミッションクリティカルなファイルが含まれていないが、おそらくいくつかの実行に非常に危険ではないことを前提にあるgrepchmodのコンボを。誤検知、つまり実行可能ビットを設定することを意図していないシバン行のファイルが発生する場合がありますが、ディレクトリの内容に関する詳細な情報がなくても、それがあなたに重大な実存的脅威をもたらすかどうかを判断できますシステムおよび/またはデータ。


私は、偽陰性ほど偽陽性について心配していません。で始まるとは思わないバイナリがあります#!
ラリー・王
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.