ユーザーのホームディレクトリのファイルのアクセス許可を修正する必要がある


24

ディレクトリのファイルのアクセス許可を再帰的に修正するツールまたはスクリプトはありますか?

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

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

私は、シェルスクリプトを一緒にハッキングする前に、そのようなユーティリティが存在するかどうかをチェックする価値があると考えました:)


回答:


51

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

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

1
-print0 / xargs -0を使用する場合は+1 :-)。
sleske

14

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回呼び出します)


6
すべてのファイルに対してchmodをフォークしているため、xargsを使用するよりも遅くなります。xargsはコマンドラインに収まる限り多くのファイルでchmodプロセスを実行します。非常に大きなツリーでは、これはかなりの違いを生む可能性があります。
デビッドパシュリー

1
また、print0 / xargs -0は非常に奇妙なファイル名でも処理します。find -execについてはよくわかりません。
sleske

8

この答えはあなたの問題を解決するものではありませんが、ファイルに必要以上の許可が与えられていない同様の問題に対して誰かが役に立つかもしれません。

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

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

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

これは、ファイルに実行許可があるため、2番目のテストと一致するため、この場合には適していません。


1
gは775と664のrwXである必要があります。–
アベンチュリン

1

freiheitのソリューションからスクリプトを作成し、基本的な引数チェックを追加しました。

#!/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

良いアイデア。ただし、ターゲットがディレクトリの場合、2行目でエラーがスローされますchmod: missing operand after ‘0644’。ターゲットが存在するかどうかを確認するために、findステートメントをチェックでラップすることを提案できますか?if [ -d $1 ]; then find $1 -type d -print0 | xargs -0 chmod 0755; fi; if [ -f $1 ]; then find $1 -type f -print0 | xargs -0 chmod 0644; fi
アンダーバース

それはほとんど正しいです。ただし、ターゲットがディレクトリである場合、その中のファイルをchmodするのを忘れており、ファイルである場合は、そのファイルのみをchmodする必要があります。
ショーン

0

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

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

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

*.bakforファイルを無視するなどの例外を使用して、特殊なケースを処理します。

#!/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

0

簡単なCシェルソリューションを見つけました。これは完全にばかではありませんが、ほとんどのディレクトリで機能するはずです。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

1
これは答えの一部を繰り返すだけでなく、OPが要求しなかったエラーと機能を導入します。
RalfFriedl

0

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

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

  • owは「書き込みアクセスをパブリックから削除する」です(「o」-その他、「-」-削除、「w」-書き込み)
  • axは「ファイルの全員に対して実行を削除する」(「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 {} +
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.