perl - 从带有 @ARGV 的嵌套反引号调用时返回变量

标签 perl system-calls

在 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/

相关文章:

perl - 如何使用 Perl 为 HTTP 请求发送不正确的 Content-Length header ?

模拟 RNA 合成的 Perl 程序

perl - 有没有一种简单的方法可以将 snmp(MIB) 字符串映射到 Perl 中的 OID?

perl - 如何检查安装的 perl 模块的代码?

c - 终止一个 c 函数

c - 系统调用 open()

c# - C# 的 SystemParametersInfo 参数定义

perl - 如何更改 MakeMaker 的默认 CFLAGS

c - 总共有多少读或写文件描述符?

c - 如何在 C 中创建临时缓冲区?