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)
您将获得一个包含由空字符分隔的记录的文件; 每条记录包含一个文件的数字权限,用户名,组名和文件名.要恢复,循环记录并调用chmod和chown.如果你想让某些目录不可写(你必须先处理它们的内容),这个-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)
小智 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)
HM.所以你需要1)读取文件权限2)以某种方式存储它们,与每个文件相关联3)读取你存储的权限并将它们设置回来
一些完整的解决方案,但一些想法:
stat -c%a filename
>644
Run Code Online (Sandbox Code Playgroud)
可能与...结合
find -exec
Run Code Online (Sandbox Code Playgroud)
为了存储这些信息,这个问题有一些有趣的想法.基本上,您创建一个与您的实际文件匹配的临时文件结构,每个临时文件包含文件权限
重置你迭代你的临时文件,读取权限和chmod实际文件.
还有一个名为Metastore的特殊工具:
Metastore是一种工具,用于将文件树中的文件/目录/链接的元数据存储到单独的文件,并在以后将存储的元数据进行比较并将其应用到所述文件树。我编写该工具作为 git 的补充,它不存储所有元数据,因此不适合在存储库中存储 /etc 等。如果您想要创建文件树的 tarball 并确保“所有内容”(例如 xattrs、mtime、所有者、组)与文件一起存储,则 Metastore 也可能会有所帮助。
它也可以作为Debian 软件包提供。