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

时间:2009-02-24 06:18:41

标签: perl tar setuid

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

使用-p开关来保存它但是如何使用Archive::Tar进行保存?我在两边使用Perl的模块。

3 个答案:

答案 0 :(得分:4)

根据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被加载之前。

N.B。因为改变一个无法使用的常数很容易出错(在为时已太晚而没有任何影响后改变它),它通常会产生一个严重的警告,不能通过常规手段禁用。

答案 1 :(得分:0)

不确定,但在官方tar命令中,您需要传递 -p 才能实现此目的

答案 2 :(得分:-1)

您可能需要查看Archive::Tar documentation了解详细信息。从简短的一瞥,似乎

$Archive::Tar::CHMOD = 1;

应该做你想要的,虽然文档声称上面的设置是默认设置。可能是Archive :: Tar剥离了高位模式位,如粘滞位。

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