我有2个perl脚本,其中一个调用另一个(system()调用)。我不希望任何其他东西能够执行第二个perl脚本。只有第一个perl脚本可以运行第二个。第二个perl脚本是一个巨大的包含许多包含和分叉以及它自己的嵌套系统调用,所以我想避免简单地将它作为子程序(或类似的东西)粘贴在第一个中。但是,将第二个perl脚本包装在perl模块/包或类似内容中是可以的。但问题是我不希望第一个perl脚本的任何用户能够独立执行第二个perl脚本。
这样的事情可能吗?
这将在RHEL6上完成。
我要用perl和linux标记这个,因为我也对基于linux的解决方案开放。我会用权限标记,因为这是我所说的核心。请注意,我没有root。
答案 0 :(得分:2)
为了防止意外滥用,您可以简单地检查父进程ID并将其命令行执行与您期望的进行比较,如下所示,使用ps
来查找该信息。但只要您的脚本的源代码对其他用户可见,您就永远无法真正阻止他们只是复制/修改它以满足他们的需求,因此您可能希望在为什么的错误消息中发出警告你认为这是一个糟糕的主意。
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.