Return 使用@ARGV 从嵌套反引号调用时的变量

Return variable when call from nested backticks with @ARGV

在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;
}

这种方法可行,但我必须在 print filters_dispatch 中打印(直接打印一个变量字符串),所以我可以获得函数 filter_kernel_version 的 return 的输出在变量 $capture

在函数内部的某些情况下filter_kernel_version我想创建一个散列和return作为匿名散列而不直接打印,但这种方式不起作用

你能推荐一个更好的方法吗?

无论您使用什么选项在进程之间进行通信,您都只能发送一个字节序列。这意味着您需要以某种方式序列化您的散列。使用 JSON 对其进行编码(例如使用 Cpanel::JSON::XS)可能是一种简单的方法。