如何使用 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 位?的主要内容,如果未能解决你的问题,请参考以下文章