可以将 perl 脚本的执行权限限制为从另一个 perl 脚本调用吗?

Posted

技术标签:

【中文标题】可以将 perl 脚本的执行权限限制为从另一个 perl 脚本调用吗?【英文标题】:Can execute permissions of a perl script be restricted to call from another perl script? 【发布时间】:2018-03-23 19:32:15 【问题描述】:

我有 2 个 perl 脚本,其中一个调用另一个(system() 调用)。我不希望其他任何东西能够执行第二个 perl 脚本。只有第一个 perl 脚本可以运行第二个。第二个 perl 脚本是一个巨大的,有很多自己的包含、分叉和嵌套系统调用,所以我想避免简单地将它作为子例程(或类似的东西)粘贴在第一个脚本中。但是,可以将第二个 perl 脚本包装在 perl 模块/包或类似文件中。但问题是我不希望第一个 perl 脚本的任何用户能够独立执行第二个 perl 脚本。

这样的事情可能吗? 这将在 RHEL6 上完成。

我将使用 perl 和 linux 来标记它,因为我也对基于 linux 的解决方案持开放态度。我将使用权限进行标记,因为这是我所谈论的核心。请注意,我没有 root。

【问题讨论】:

你不能在第一个脚本中包含use script2吗? 如果你把第二个脚本做成一个包,use在第一个脚本中,并调用相关方法,你应该没问题。你可以chmod 0444第二个脚本(包)。除了“执行”包不会做很多事情之外。 我不认为有什么办法可以做这种限制。 无论您添加什么检查都可能会被删除,因此您能做的最好的事情就是防止意外误用。您需要做的就是让脚本 1 将“秘密”值作为参数传递给脚本 2,并让脚本 2 检查它。 不幸的是,我的用户精通 perl。所以他们也可能只是在自己的脚本中使用 perl 模块。我想到并且喜欢将访问代码从第一个传递到第二个的想法。但同样,如果密码是开放文本,我精通 perl 的用户可能会做同样的事情。但是,如果它以某种方式被加密,也许作为一个不可读和不可复制的值可以传递给第二个脚本,这可能会起作用。 【参考方案1】:

为了防止意外误用,您可以简单地检查父进程 ID,并将其命令行执行与您期望的进行比较,如下所示,它使用 ps 来查找该信息。但是只要您的脚本的源代码对其他用户可见,您就永远无法真正阻止他们复制/修改它以满足他们的需求,因此您可能希望在 why 的错误消息中添加警告 你认为这是个坏主意。

script1.plsome_other_script.pl(两者相同,但名称不同)

#!/usr/bin/env perl

use warnings;
use strict;

(system('./script2.pl') == 0)
    or die "Unable to run script2.pl!";

script2.pl

#!/usr/bin/env perl

use warnings;
use strict;

chomp(my $ppid = `ps -o ppid= -p $$`);
chomp(my $parent_command = `ps -o command= $ppid`);

die "script2.pl must only be called from script1.pl!"
    unless $parent_command =~ m|perl\s+script1\.pl$|; # as suggested by @zdim

print "Have some pi : 3.14159\n";

输出

$ perl script1.pl
Have some pi : 3.14159

$ perl script2.pl
script2.pl must only be called from script1.pl! at script2.pl line 9.

$ perl some_other_script.pl
script2.pl must only be called from script1.pl! at ./script2.pl line 9.
Unable to run script2.pl! at some_other_script.pl line 6.

【讨论】:

这是我做的事情(用于记录)。但为此目的,它被stealing.pl script1.pl 击败——其中stealing.pl 使用script1 在命令行上提交它(并丢弃该参数)。就像你说的,如果脚本是可读的,任何事情都可以被打败,但我们仍然可以加强这一点,比如/(perl\s+)?script1\.pl$/(或者这样) 事实上,我认为perl 必须在那里,这样才能删除? 量词 是的,但你也可以绕过这个问题,使用类似 argv0 的东西:cr.yp.to/ucspi-tcp/argv0.html 完全同意(d)。 (他们甚至可以在其他目录中将其命名为script1。我不确定是否可以使用ps 选项来击败它,但即使可以,该过程也可能会谎报ps 报告的名称)。我的意思是这样做仍然可以提供一点帮助。 谢谢 xxfelixxx 和 zdim。这很巧妙,应该可以解决问题。

以上是关于可以将 perl 脚本的执行权限限制为从另一个 perl 脚本调用吗?的主要内容,如果未能解决你的问题,请参考以下文章

从另一个 Perl 脚本内部调用 Perl 搜索和替换命令时不起作用

从另一个具有不同 Active perl 版本的 perl 脚本调用 perl 函数

从另一个环境调用 Perl 在后台

Perl ipc 使用管道从另一个进程启动一个进程的执行

Perl 缓冲区刷新

从 Perl 脚本运行 PHP