我刚刚发现我的备份缺少 ACL,在修复此问题之前还原将无法进行。
幸运的是,我可以检查正在运行的系统上的权限应该是什么样子,例如:
已恢复:
# file: samba/sysvol
# owner: root
# group: 3000000
user::rwx
group::rwx
other::---
跑步:
# file: samba/sysvol
# owner: root
# group: 3000000
user::rwx
user:root:rwx
group::rwx
group:3000000:rwx
group:3000001:r-x
group:3000002:rwx
group:3000003:r-x
mask::rwx
other::---
default:user::rwx
default:user:root:rwx
default:group::---
default:group:3000000:rwx
default:group:3000001:r-x
default:group:3000002:rwx
default:group:3000003:r-x
default:mask::rwx
default:other::---
没有可遵循的简单权限模式,因此手动协调将花费很长时间并且容易出错。
问题:
是否可以“克隆”ACL权限?
即递归读取所有文件和文件夹上的 ACL(getfacl?)并写入(setacl?)到其他地方的相同文件和文件夹列表?
如果源和目标都在本地,或者您可以通过 SSH 或 rsync 协议在它们之间复制,则可以使用
rsync -A
在目录之间复制 ACL。
这将在同一台计算机上本地复制 ACL。
rsync -Ar dir1/ dir2/
如果两台服务器都有兼容的 ACL,您可以使用它通过网络复制 ACL,而无需实际再次复制文件。
rsync -Ar /dir1/ user@destination:/dir2/
或
rsync -Ar user@source:/dir1/ /dir2/
取决于您正在运行命令的服务器。
来自 rsync 手册页:
-A,--acls 此选项导致 rsync 将目标 ACL 更新为与源 ACL 相同。该选项还意味着 --perms。
源系统和目标系统必须具有兼容的 ACL 条目 以使该选项正常工作。请参阅 --fake-super 选项 备份和恢复不兼容的 ACL 的方法。
我正在寻找一个命令来复制具有所有权、权限、ACL 的目录,而无需递归复制内容。我最终得到了一个涉及 mkdir、chown、chmod、setfacl、getfacl 的多命令解决方案:-)
proj=project1
srcbase="/mydata"
destbase="/archive/mydata"
if [ ! -d $destbase/$proj ]; then
echo "Cloning properties of $srcbase/$proj to $destbase/$proj"
mkdir $destbase/$proj
chown --reference=$srcbase $destbase/$proj
chmod --reference=$srcbase $destbase/$proj
cd $srcbase
getfacl $proj > /tmp/${proj}.acl
cd -
cd $destbase
setfacl --restore /tmp/${proj}.acl
cd -
else
echo "Archive directory already exists, skipping: $destbase"
fi
unset proj srcbase destbase
也许有一种方法可以通过告诉 rsync 不要遍历目录来做到这一点...