可以将 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.pl 和 some_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 搜索和替换命令时不起作用