誰かがディレクトリのファイル権限を再帰的に修正するツールまたはスクリプトを持っていますか?
Ubuntu Linuxマシンでは、エラーのある完全な777権限(ユーザー、グループ、その他-読み取り、書き込み、実行)で、一連のファイルがUSBディスクにコピーされました。修正したユーザーのディレクトリに戻したいのですが。
ディレクトリは775で、他のすべてのファイルは664にすることができます。すべてのファイルはイメージ、ドキュメント、またはMP3であるため、実行可能である必要はありません。ディレクトリビットが設定されている場合は実行が必要です。そうでない場合は、ユーザーとグループ、読み取りと書き込みのみが必要です。
シェルスクリプトをハッキングする前に、そのようなユーティリティが存在するかどうかを確認する価値があると思いました:)
これでうまくいくはずです:
find /home/user -type d -print0 | xargs -0 chmod 0775
find /home/user -type f -print0 | xargs -0 chmod 0664
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回呼び出します)
この答えはあなたの問題を解決しませんが、ファイルが彼らがすべきよりも少ないアクセス許可を持っているような同様の問題のために誰かがそれを役に立つかもしれません。
# chmod -R . u=rwX,g=rX,o=rX
魔法は、xではなくXアクセス許可です。 chmodのマンページでは、次のように説明しています。
ファイルがディレクトリであるか、一部のユーザーに対してすでに実行権限を持っている場合にのみ、実行/検索
ファイルには実行権限があるため、2番目のテストと一致するため、これはあなたのケースには適していません。
権限を修正する必要があったので、先日、本当に単純な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
私はフライハイトの解決策からスクリプトを作りました、それは基本的な引数チェックを追加します。
#!/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
簡単な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
元の要求に正確には応答しないが、OPが意図している可能性が高い代替策は、許可を記号で指定することです。たとえば、OPが「パブリックの書き込みアクセス権を削除し、すべてのファイルから実行権限を削除する」ことを望んでいると想定します。
これは、シンボリック権限表現を使用する場合に可能です。
"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 {} +
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