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)可能是一种简单的方法。
在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)可能是一种简单的方法。