在 visudo Ubuntu 中,我将此程序列入白名单(出于安全目的,我这样做,参数化了所有命令)
myuser ALL=(root) NOPASSWD:/App/Filter_Parameters_Wrap.pm *
在program.pl中
my $capture = qx("/usr/bin/sudo /App/Filter_Parameters_Wrap.pm kernel_version");
在模块Filter_Parameters_Wrap中:
my $fuction = $ARGV[0];
print filters_dispatch($fuction) if defined $fuction;
sub filters_dispatch {
my $filter = shift;
my $dispatch = {
kernel_version => \&filter_kernel_version,
};
return $dispatch->{$filter}->();
}
sub filter_kernel_version {
my $command = '/bin/uname -a';
my $sudo = App::Sudo::Main_Sudo->root($command);
utf8::decode($sudo);
return $sudo;
}
这种方法是有效的,但是我必须在 printfilters_dispatch 中进行打印(直接打印变量字符串),这样我就可以在变量 $capture 中获得函数 filter_kernel_version
返回的输出
在某些情况下,在函数filter_kernel_version
中,我想创建一个哈希并作为匿名哈希返回而不直接打印,但这种方式不起作用
您能推荐更好的方法吗?
最佳答案
无论您使用什么选项在进程之间进行通信,您都将仅限于发送字节序列。这意味着您需要以某种方式序列化您的哈希值。使用 JSON 对其进行编码(例如使用 Cpanel::JSON::XS )可能是一种简单的方法。
关于perl - 从带有 @ARGV 的嵌套反引号调用时返回变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63051597/