ファイルのアクセス許可をバックアップおよび復元する


17

ファイルの所有権とアクセス権(で変更することができ、物事バックアップおよび復元する方法があるchownとはchmod)?

Windowsでicaclsを使用してこれ行うことができます。

アクセス制御リストはどうですか?


異なるディストリビューションは異なるパッケージマネージャを使用するため、使用しているディストリビューションを指定すると役立ちます。
garethTheRed

@garethTheRed、使用されているfsにも依存していますか、それとも単にディストリビューションに依存していますか?
-leeand00

1
ファイルシステムに依存するとは思わない。
garethTheRed

今まで、完璧な答えはありません。
キティガール

回答:


24

これを行うには、aclパッケージのコマンドを使用します(これはすべてのメインストリームディストリビューションで利用可能である必要がありますが、基本インストールの一部ではない場合があります)。ACLが存在する場合はACLをバックアップおよび復元しますが、ACLをサポートしていないシステム上でも基本的なアクセス許可に対して機能します。

現在のディレクトリとそのサブディレクトリのアクセス許可を再帰的にバックアップするには:

getfacl -R . >permissions.facl

権限を復元するには:

setfacl --restore=permissions.facl

うーん。私は本当に ACLについて調べる必要があります。
ロアイマ

1
生成されたファイルでは、それらもディレクトリに関連していますか?
leeand00

2
@ leeand00はい、生成されたファイルは常に相対ファイル名を使用します。
ジル 'SO-悪であるのをやめる'

unix.stackexchange.com/questions/364517/… に基づく@Gillessetfaclファイルは、それ以降はchmod再び使用できません 。競合が発生する可能性がありますか?
キティガール

1
@kittygirlあなたが何を求めているのか分かりません。「setfaclファイルはその後chmodできない」とはどういう意味ですか?これはunix.stackexchange.com/questions/364517/…と何の関係がありますか?何の矛盾?
ジル「SO-悪であるのをやめる」

2

私はこれを行う「既製の」何かを知りません。ただし、基本的なアクセス許可を処理するスタータースクリプトは次のとおりです。説明のACLは処理されませんが、質問では明示的に除外されます。(病理学的ファイル名-空白文字で始まるファイル名、または印刷できない文字を含むファイル名でも失敗します。)

許可を保存する

find * -depth -exec stat --format '%a %u %g %n' {} + >/tmp/save-the-list

権限を復元する

while read PERMS OWNER GROUP FILE
do
    chmod "$PERMS" "$FILE"
    chown "${OWNER}:${GROUP}" "$FILE"
done </tmp/save-the-list

病理学的ファイル名でもACLが失敗するということですか?
キティガール

@kittygirl OPがACLを要件から明示的に除外したため、スクリプトレットにACLの処理を含めませんでした。コードは特に堅牢ではないことを念頭に置いて、好きなものを追加できます(病理学的ファイル名を説明するコメントを参照)。
ロアイマ

問題が見つかりました:見つけることができません.htaccessgitignore...
kittygirl

0
#!/bin/bash
# prepare files
home="/home/exchange"
cd $home
>acl
echo "#!/bin/bash">recovery_acl.sh
echo "cd $home">>recovery_acl.sh
f='./'
# create acl file sorted by dir_level
for i in `seq 0 15`;do
  find . -mindepth $i -maxdepth $i -type d -exec getfacl {} +|grep -E '*UTS|file:'>>acl
done
sed -i 's/default\:user/\-dm\ u/g' acl
sed -i 's/default\:group/\-dm\ g/g' acl
sed -i 's/user/\-m\ u/g' acl
sed -i 's/group/\-m\ g/g' acl
sed -i 's/\#\ file\:\ /\.\//g' acl
sed -i 's,\\,\\\\,g' acl

while IFS='' read -r line ; do
  # grep dir name
  if echo "$line" | grep -q "$f" ; then
    dir="$line"
    continue
  fi
  echo setfacl $line '"'$dir'"'>>recovery_acl.sh
  # grep non def acl (for files)
  if echo "$line" | grep -q '\-m' ; then
    echo setfacl $line '"'$dir'"'/*>>recovery_acl.sh
  fi
done < "acl"

sed -i "s/\\\134/\\\\\\\134/g" recovery_acl.sh
sed -i "s/\\\040/\\\\ /g" recovery_acl.sh

このbashスクリプトはaclのみを取得します(私の場合、ファイルacls = dir(parent)acl)。スクリプトの実行後、別の「recovery_acl.sh」を作成します。

「そのようなファイルまたはディレクトリがありません」などのエラーを回復するときは、dirが空であるか、dirnameに2つ以上のスペースが含まれていることを意味します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.