如何使用 Perl 的 Archive::Tar 保存 tar 档案中的 setuid 位?

Posted

技术标签:

【中文标题】如何使用 Perl 的 Archive::Tar 保存 tar 档案中的 setuid 位?【英文标题】:How do I preserve the setuid bit in tar archives with Perl's Archive::Tar? 【发布时间】:2009-02-24 06:18:40 【问题描述】:

我正在使用 Perl 的 Archive::Tar 模块。它保留了文件权限,但不保留粘性位。在我提取档案的另一端,所有的粘性位都消失了。我认为 UNIX/LINUX 操作系统将这些粘性位存储在其他地方。如何让我的存档也保留粘性位?

使用 -p 开关来 tar 保留它,但我如何使用 Archive::Tar 来做到这一点?我在两边都使用 Perl 的模块。

【问题讨论】:

【参考方案1】:

根据 Fine Source,Archive::Tar::File 从模式中剥离高位。 您可以在脚本的开头尝试以下魔法咒语(在任何事情之前 可能已经引用了 Archive::Tar) 并查看它是否颠覆了它:

use Archive::Tar::Constant ();
BEGIN 
    local $SIG__WARN__ = sub;
    *Archive::Tar::Constant::STRIP_MODE = sub() sub shift ;

...
use Archive::Tar;
...

简要说明:STRIP_MODE 是一个常量,它包含一个可以传递原始模式并返回应该存储的模式的子例程。它通常设置为

sub  shift() & 0777 

因为它是一个常量,从 Archive::Tar::Constant 导入到 Archive::Tar::File 并在那里使用,所以无论它设置什么都将在编译时内联到 Archive::Tar::File .所以要改变它,必须在它被内联之前改变常量,也就是说,在 Archive::Tar::File 被加载之前。

注意因为更改一个可内联常量容易出错(在太晚而没有任何效果之后更改它),它通常会生成一个无法通过常规方式禁用的严重警告。

【讨论】:

【参考方案2】:

不确定,但是在官方的 tar 命令上,你需要通过 -p 才能做到这一点

【讨论】:

【参考方案3】:

您可能想查看Archive::Tar documentation 了解详情。乍一看,似乎

$Archive::Tar::CHMOD = 1;

应该做你想做的事,尽管文档声称上述设置是默认设置。可能是 Archive::Tar 像粘性位一样剥离了高阶模式位。

归档文件是使用 Archive::Tar 创建和提取的,还是在一端或另一端使用标准 tar 程序?

【讨论】:

以上是关于如何使用 Perl 的 Archive::Tar 保存 tar 档案中的 setuid 位?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Perl 从巨大的存档中提取单个

在 perl 中创建和读取 tar.bz2 文件

Go-archive/tar: write after close gopher.txt

Linux: 如何分割文件,不再被 4G 大小限制了

Linux: 如何分割文件,不再被 4G 大小限制了

Linux 需要掌握的一些命令