是否可以创建一个脚本来保存和恢复权限?

Nin*_*Cat 25 unix linux permissions shell

我正在使用Linux系统,需要在一组嵌套文件和目录上试验一些权限.我想知道是否有一些方法来保存文件和目录的权限,而不保存文件本身.

换句话说,我想保存权限,编辑一些文件,调整一些权限,然后将权限恢复到目录结构,保持更改的文件到位.

那有意义吗?

Gil*_*il' 41

最简单的方法是使用ACL工具,即使您实际上没有使用ACL.只需调用getfacl -R . >saved-permissions以备份目录树的权限并setfacl --restore=saved-permissions恢复它们.

否则,备份权限的方法是find -printf.(需要GNU,但这就是你在Linux上所拥有的.)

find -depth -printf '%m:%u:%g:%p\0' >saved-permissions
Run Code Online (Sandbox Code Playgroud)

您将获得一个包含由空字符分隔的记录的文件; 每条记录包含一个文件的数字权限,用户名,组名和文件名.要恢复,循环记录并调用chmodchown.如果你想让某些目录不可写(你必须先处理它们的内容),这个-depth选项find就是这样.

您可以使用从Daniel Alder提供的代码段派生的此bash代码段恢复权限 :

while IFS=: read -r -d '' mod user group file; do
  chown -- "$user:$group" "$file"
  chmod "$mod" "$file"
done <saved-permissions
Run Code Online (Sandbox Code Playgroud)

您可以使用以下awk脚本将find输出转换为某些shell代码以恢复权限.

find -depth -printf '%m:%u:%g:%p\0' |
awk -v RS='\0' -F: '
BEGIN {
    print "#!/bin/sh";
    print "set -e";
    q = "\047";
}
{
    gsub(q, q q "\\" q);
    f = $0;
    sub(/^[^:]*:[^:]*:[^:]*:/, "", f);
    print "chown --", q $2 ":" $3 q, q f q;
    print "chmod", $1, q f q;
}' > restore-permissions.sh
Run Code Online (Sandbox Code Playgroud)

  • 最新的解决方案似乎已经破解,因为它只是设法在这里处理`.*`文件.我不打扰调试,因为基于ACL的方法工作得很好.只是标记.... (2认同)
  • @DanielAlder我认为最好交换'chmod'和'chown'语句,以便'chown'首先出现.这样,如果许可包括SUID和/或SGID(例如,6755而不仅仅是755),那么这不会被chown重置. (2认同)

小智 12

首先安装ACL包:

sudo apt-get install acl
Run Code Online (Sandbox Code Playgroud)

递归地权限和所有权存储到文件:

getfacl -R yourDirectory > permissions.acl
Run Code Online (Sandbox Code Playgroud)

恢复(相对于当前路径):

setfacl --restore=permissions.acl
Run Code Online (Sandbox Code Playgroud)


sec*_*ond 6

HM.所以你需要1)读取文件权限2)以某种方式存储它们,与每个文件相关联3)读取你存储的权限并将它们设置回来

一些完整的解决方案,但一些想法:

stat -c%a filename
>644
Run Code Online (Sandbox Code Playgroud)

可能与...结合

find -exec
Run Code Online (Sandbox Code Playgroud)

为了存储这些信息,这个问题有一些有趣的想法.基本上,您创建一个与您的实际文件匹配的临时文件结构,每个临时文件包含文件权限

重置你迭代你的临时文件,读取权限和chmod实际文件.


Pet*_*lák 5

还有一个名为Metastore的特殊工具:

Metastore是一种工具,用于将文件树中的文件/目录/链接的元数据存储到单独的文件,并在以后将存储的元数据进行比较并将其应用到所述文件树。我编写该工具作为 git 的补充,它不存储所有元数据,因此不适合在存储库中存储 /etc 等。如果您想要创建文件树的 tarball 并确保“所有内容”(例如 xattrs、mtime、所有者、组)与文件一起存储,则 Metastore 也可能会有所帮助。

它也可以作为Debian 软件包提供。