web-dev-qa-db-ja.com

ユーザーのホームディレクトリのファイル権限を修正する必要がある

誰かがディレクトリのファイル権限を再帰的に修正するツールまたはスクリプトを持っていますか?

Ubuntu Linuxマシンでは、エラーのある完全な777権限(ユーザー、グループ、その他-読み取り、書き込み、実行)で、一連のファイルがUSBディスクにコピーされました。修正したユーザーのディレクトリに戻したいのですが。

ディレクトリは775で、他のすべてのファイルは664にすることができます。すべてのファイルはイメージ、ドキュメント、またはMP3であるため、実行可能である必要はありません。ディレクトリビットが設定されている場合は実行が必要です。そうでない場合は、ユーザーとグループ、読み取りと書き込みのみが必要です。

シェルスクリプトをハッキングする前に、そのようなユーティリティが存在するかどうかを確認する価値があると思いました:)

27
mlambie

これでうまくいくはずです:

find /home/user -type d -print0 | xargs -0 chmod 0775
find /home/user -type f -print0 | xargs -0 chmod 0664
52
freiheit

findは-execを使用して単独でトリックを実行できます。

find /home/user -type f -exec chmod 0664 {} \;
find /home/user -type d -exec chmod 0775 {} \;

findがエントリごとにchmodを生成しないようにするには:

find /home/user -type f -exec chmod 0664 {} +
find /home/user -type d -exec chmod 0775 {} +

(これは、ファイルごとに1つのchmodではなく、すべてのファイルのリストをパラメーターとして使用して、chmodを効果的に1回呼び出します)

15
ThorstenS

この答えはあなたの問題を解決しませんが、ファイルが彼らがすべきよりも少ないアクセス許可を持っているような同様の問題のために誰かがそれを役に立つかもしれません。

# chmod -R . u=rwX,g=rX,o=rX

魔法は、xではなくXアクセス許可です。 chmodのマンページでは、次のように説明しています。

ファイルがディレクトリであるか、一部のユーザーに対してすでに実行権限を持っている場合にのみ、実行/検索

ファイルには実行権限があるため、2番目のテストと一致するため、これはあなたのケースには適していません。

8
David Pashley

権限を修正する必要があったので、先日、本当に単純なbashスクリプトを作成しました。基本的なルート以外のファイルおよびフォルダーのアクセス許可をリセットする正式なユーティリティがないのはなぜですか?

このスクリプトでは、findを使用して、すべてのフォルダーと644個のライブラリーを755個作成しています。次に、readelfを使用して各ファイルをテストし、バイナリelfヘッダーがあるかどうかを確認します。そうでない場合は、最初の2文字でShebang #!をスキャンします。それはそれらのインスタンス755と他のすべての644をチェックして、ファイルにすでに一致する権限があるかどうかを確認します。

特殊なケースは、無視されるファイルの*.bakなどの例外を除いて処理されます。

#!/bin/bash
read -r -p "Correct file and folder permissions? [y/N] " chse
if [[ "$chse" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
  echo "Processing ..."
  find -H $(pwd) -type d -exec chmod 0755 {} \;
  # set dirs to 755
  find -H $(pwd) -type f \( -iname '*.so.*' -o -iname '*.so' \) -exec chmod 0644 {} \;
  # libs
  IFS=$'\n'
  for value in $(find -H $(pwd) -type f ! \( -iname '*.so.*' -o -iname '*.so' -o -iname '*.bak' \) -printf '%p\n'); do
    tstbin=$(readelf -l "$value" 2>/dev/null | grep -Pio 'executable|shared')
    if [ -z "$tstbin" ]; then
      tstbat=$(cat "$value" | head -c2 | grep -io '#!')
      if [ -n "$tstbat" ]; then
        perm=$(stat -c '%a' "$value")
        if [ "$perm" != "755" ]; then
          chmod 755 $value
          echo "Set script  755 $value"
          # set batch to 755
        fi
      else
        perm=$(stat -c '%a' "$value")
        if [ "$perm" != "644" ]; then
          chmod 644 $value
          echo "Set regular 644 $value"
          # set regular files to 644
        fi
      fi
      # above aren't elf binary
    else
      perm=$(stat -c '%a' "$value")
      if [ "$perm" != "755" ]; then
        chmod 755 $value
        echo "Set binary  755 $value"
        # set elf binaries to 755
      fi
    fi
  done
  unset IFS
  # process linux permissions for files and folders
else
  echo "Aborted."
fi
1
noabody

私はフライハイトの解決策からスクリプトを作りました、それは基本的な引数チェックを追加します。

#!/bin/sh

if [ $# -lt 1 ]; then
    echo "USAGE: $0 <path>"
    exit 1
fi

find $1 -type d -print0 | xargs -0 chmod 0755
find $1 -type f -print0 | xargs -0 chmod 0644
1
Marcs

簡単なC-Shellソリューションを見つけました。これは完全な証拠ではないかもしれませんが、ほとんどのディレクトリで機能するはずです。これは、Unixの「file」コマンドが機能することを前提としており、execファイルを見つけて、exec権限にリセットします。

find /home/user -type d | xargs chmod 0775
find /home/user -type f | xargs -0 chmod 0664
find /home/user -type f -exec file {} \; | grep executable | cut -d":" -f1 | xargs chmod 0775
0
K. Donovan

元の要求に正確には応答しないが、OPが意図している可能性が高い代替策は、許可を記号で指定することです。たとえば、OPが「パブリックの書き込みアクセス権を削除し、すべてのファイルから実行権限を削除する」ことを望んでいると想定します。

これは、シンボリック権限表現を使用する場合に可能です。

  • o-wは「パブリックからの書き込みアクセス権の削除」です(「o」-その他、「-」-削除、「w」-書き込み)
  • a-xは「ファイルの実行者全員の実行を削除する」(「a」-すべて、「-」-削除、「x」-実行)

"0664"を明示的に設定する代わりに、この方法でそれを書き込むと、以前にロックダウンされたファイルへの追加のアクセス許可を誤って許可することを回避できます。たとえば、ファイルが0770の場合、誤って0664になることはありません。

最初の要件を実行するには、chmodを使用するだけです。

chmod --recursive o-w $dir

2番目の要件を実行するには:

find $dir -type f -exec chmod a-x {} +

または両方を行うには:

find $dir -type f -exec chmod a-x,o-w {} +
find $dir -type d -exec chmod o-w {} +
0
chutz

Sshを使用している場合は、~/.ssh権限を変更しないことをお勧めします。

DIR=/home/user
find $DIR -type d -not -path "$DIR/.ssh" -print0 | xargs -0 chmod 0775
find $DIR -type f -not -path "$DIR/.ssh/*" -print0 | xargs -0 chmod 0664
0
Tombart