使用 GNU tar 指定不同的 --mode 值

使用 GNU tar 指定不同的 --mode 值

我正在尝试使用 GNUtar从网络驱动器上存储的目录创建 tarball。该网络驱动器默认存储在其上的所有内容的模式为0700( -rwx------),并且在创建 tarball 之前无法更改。

我使用此命令更改了 tarball 中存储的文件的权限:

tar -c --mode=0644 -f project.tar ./project/

问题是 tarball 中的所有内容的权限都更改为0644( -rw-r--r--)。该目录中没有可执行文件./project/,因此0644对于所有文件没关系,但是目录最终0644也继承了。在另一个系统上提取时,在添加执行位之前无法输入目录。

是否有可能指示 GNUtar更改所有模式文件0644改变所有的模式目录0755?几乎就像命令中的-type fand一样。-type dfind

操作系统是 Debian 11 Bullseye 版本,GNUtar是 1.34 版本。

答案1

GNUtar, 你可以做:

tar --mode a=r,u+w,a+X -cf file.tar directory

这将为您rwxr-xr-x提供目录类型的文件以及rw-r--r--所有其他类型的文件(包括符号链接,甚至目录)。其构建为:

  • a=r:重置权限r--r--r--
  • u+w: 添加wuser,所以rw-r--r--
  • a+X:添加xall,但仅适用于目录类型的文件,因此 rwxr-xr-x适用于目录和rw-r--r--任何其他类型的文件。

为了获得充分的灵活性,您可以使用star:

star cf file.tar -find directory \
     -type d -chmod 755 \
  -o -type l -chmod 777 \
  -o         -chmod 644

我们rwxr-xr-x从哪里获取目录类型的文件drwxrwxrwx符号墨水类型的文件l以及rw-r--r--任何其他类型的文件。

或者使用符号形式:

star cf file.tar -find directory \
     -type d -chmod a=rx,u+w \
  -o -type l -chmod a=rwx \
  -o         -chmod a=r,u+w

答案2

您可以使用相对与 chmod 类似的权限,而不仅仅是固定模式--mode。检查手动的,不仅仅是手册页。

您可以使用 usea+r授予每个人读取权限并a+X如果它存在于任何地方,则授予执行权限。

tar -c --mode=a+rX …

但是,如果文件系统使所有文件都可执行,则将导致存档中的所有文件都可执行。我认为没有办法使用 GNU tar 来以不同的方式调整文件。 (实际上,不存在:+X如果目录可读,也使目录可执行,所以a=r,u+w,a+X可以工作.)

Pax根本没有任何方法可以调整权限。

我认为最简单的方法是使用绑定文件系统使用不同的元数据创建文件系统的视图。这是一个保险丝文件系统,因此只要您的系统安装了 FUSE 本身,就可以在没有管理员权限的情况下安装和使用它。 Bindfs 提供比 GNU tar 更高的灵活性--mode。另一个好处是它可以与不具有类似功能的程序一起使用tar --mode。您可以使用--perms选项更改权限:

mkdir -p views/project
bindfs --no-allow-other -p a+rD project views/project
tar -C views -cf project.tar project
fusermount -u views/project
rmdir views/project

Python 有一个tarfile模块,使得编写代码相对方便。我认为它支持迭代存档,因此您不需要立即将整个存档存储在内存中。但您仍然需要编写大量代码。

答案3

您可以通过不使用 来解决tar无法根据规则更改属性的问题tar

mksquashfs有一个迷你语言行动内置,可根据某些过滤规则应用于存档条目;整个事情都有记录这里。这很简单:语法是action@condition,所以对我们来说:

mksquashfs ./project/ project.squashfs -no-strip -action 'chmod(0755)@type(d)' -action 'chmod(644)@type(f)' 

会让所有目录项都有0755权限,所有文件都有0644权限。您的文件夹中可能有 fifo、套接字、符号链接,因此也许更好的分类是“目录”和“非目录的所有内容”,而不是“目录”和“文件”;然后,免费添加一些可能比您的网络更快的压缩:

mksquashfs ./project/ project.squashfs \
          -no-strip \
          -action 'chmod(0755)@type(d)' \
          -action 'chmod(644)@!type(d)' \
          -comp zstd -Xcompression-level 10

该存档的用途:

  1. unsquashfs project.squashfs可以使用(也可能是您最喜欢的图形存档管理器)来提取
  2. (在 Linux 上)可以使用只读方式挂载(作为 root)mount -o loop gr-ieee802-11.squash /home/marcus/mnt/
  3. (在 Linux 上)可以由任何使用现代桌面环境的用户以只读方式安装:(udisksctl loop-setup -f project.squashfs如果没有自动安装,udisksctl mount -b或者单击文件管理器中新出现的驱动器。

相关内容