ディレクトリに2つのファイルがあります。 1つには正しい権限があり、もう1つにはありません。権限のセットをあるファイルから別のファイルに「コピー」する方法はありますか?
GNUバージョンのchmodユーティリティは モードをコピー 1つのファイルから(RFile
)から別の(file
)へ。
chmod --reference=RFile file
GNU coreutils は、ほとんどのLinuxディストリビューションやCygwinなどで見られます。 すべてではありませんchmod実装 このオプションを提供します。
私はこれを思いついた:
find $SOURCE -mindepth 1 -printf 'chmod --reference=%p\t%p\n'|sed "s/\t$SOURCE/ $DEST/g"|sh
それは完全な防弾ではありませんが、私が必要なことをします。
getfacl
を使用して、ファイルの権限、所有者、グループ、および追加のACL(アクセス制御リスト)の完全なリストを取得できます。
$ getfacl filename.txt
# file: filename.txt
# owner: score
# group: score
user::rw-
group::---
other::---
その出力をファイル(例:acl.txt
)に保存すると、setfacl --restore acl.txt
を使用してこの形式から復元できます。単一のファイルのみを復元する必要があり、そのファイルのファイル名が元のファイルとは異なる場合は、setfacl --set-file acl.txt filename.txt
(filename.txt
は新しいファイル名)を使用します。
元の権限をacl.txt
に保存:
$ getfacl filename.txt > acl.txt
権限を上書きします(デモンストレーション用。これは、次の手順で復元が機能することを確認するためです)
$ chmod 777 filename.txt
$ Sudo chown nobody:root filename.txt
$ ls -l filename.txt
-rwxrwxrwx 1 nobody root 0 Jan 8 14:24 filename.txt
setfacl
を使用して、acl.txt
から正しい権限を復元します。
$ Sudo setfacl --restore acl.txt
$ ls -l filename.txt
-rw------- 1 score score 0 Jan 8 14:24 filename.txt
ファイル名はgetfacl
によって生成された# file:
コメントから取得されるため、コマンドラインで指定する必要はありません。
これらの権限を別のファイルに復元する場合は、次のように--set-file
の代わりに--restore
を使用できます。
$ setfacl --set-file acl.txt second_filename.txt
/usr
内の一部のファイルのアクセス許可を上書きすることになったが、上書きしたファイルがわからない場合は、通常、同様に構成された別のシステムから復元することで修正できます。
稼働中のシステムからのバックアップ権限(注:getfacl
は相対パスを生成するため、両方のマシンの一貫した場所にcd
するようにしてください)
# cd /
# getfacl -R usr > /root/acls.txt
権限が壊れているシステムにACLダンプをコピーします
$ scp root@working-system:/root/acls.txt .
$ scp acls.txt root@broken-system:/root/
ACLダンプを復元して、破損した権限を既知の正常なマシンの権限で上書きします。
# cd /
# setfacl --restore /root/acls.txt
これを試して:
find /PATH/TO/TARGET -exec chmod --reference /PATH/TO/SOURCE/{} {} \;
これは再帰的に増加し、すべてのファイルをchmodします。2つのディレクトリがファイルで一致しない場合、「そのようなファイルまたはディレクトリはありません」というエラーがたくさん表示されます。