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

标签 perl tar setuid

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

使用 -p 开关来 tar 可以保留它,但我该如何使用 Archive::Tar 来保存它? ?我在两侧都使用 Perl 的模块。

最佳答案

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

注意由于更改内联常量很容易出错(在更改时为时已晚,无法产生任何效果),因此它通常会生成严重警告,无法通过常规方法禁用。

关于perl - 如何使用 Perl 的 Archive::Tar 保留 tar 存档中的 setuid 位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/580653/

相关文章:

perl:打印对象属性

Perl 段落 n 元语法

c++ - 从 C++ 程序创建 tar.gz-archive 不起作用

C通过Makefile设置可执行权限

security - 是否安全访问环境变量标识的目录中的文件?

linux - 在/dev 文件上设置 root-only 权限并构建二进制文件

perl - Mojolicious 自动启动/init() 子例程

Perlbrew 错误 : Can't Locate Pod/Usage. 下午

linux - 无法使用 tar 提取 nodejs 源文件

bash - 将 stdin 作为另一个文件添加到 tar 存档