备份和还原文件权限


17

是否有备份和还原文件所有权和权限(可以通过chown和更改的内容chmod)的方法?

您可以使用icacls在Windows中执行此操作

那么访问控制列表呢?


如果您声明要使用哪个发行版,这将有所帮助,因为不同的发行版使用不同的程序包管理器。
garethTheRed 2015年

@garethTheRed,它还取决于所使用的fs,还是仅取决于发行版?
leeand00

1
我怀疑这将取决于文件系统。
garethTheRed 2015年

到目前为止,还没有完美的答案。
kittygirl,

Answers:


24

您可以使用acl软件包中的命令来执行此操作(所有主流发行版中都应提供该命令,但可能不是基本安装的一部分)。当存在ACL时,它们将备份并还原ACL,但即使在不支持ACL的系统上,它们也可用于基本权限。

要递归备份当前目录及其子目录中的权限:

getfacl -R . >permissions.facl

恢复权限:

setfacl --restore=permissions.facl

嗯 我真的需要阅读ACL。
roaima 2015年

1
在生成的文件中,它们也相对于目录吗?
leeand00

2
@ leeand00是的,生成的文件始终使用相对文件名。
吉尔斯(Gillles)“所以-别再作恶了”

@Gilles ,基于unix.stackexchange.com/questions/364517/…setfacl文件,然后不能 chmod再出现,也许会引起冲突?
kittygirl

1
@kittygirl我不知道你在问什么。“ setfacl文件然后无法再次chmod”是什么意思?这与unix.stackexchange.com/questions/364517/…有什么关系?有什么冲突?
吉尔(Gilles)'所以

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

@kittygirl我没有在脚本中包含对ACL的任何处理,因为OP已将其明确排除在要求之外。您可以添加自己喜欢的代码,但要记住代码并不是特别健壮(请参阅描述病理性文件名的注释)。
roaima

我发现了一个问题:找不到.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在一起有两个/多个空格。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.