Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何为IPC::Run提供由用户输入设置的参数,该参数包含嵌入的空格_Perl_Openssl_Centos6 - Fatal编程技术网

Perl 如何为IPC::Run提供由用户输入设置的参数,该参数包含嵌入的空格

Perl 如何为IPC::Run提供由用户输入设置的参数,该参数包含嵌入的空格,perl,openssl,centos6,Perl,Openssl,Centos6,centos-6.8 perl,v5.10.1(*)为x86_64-linux-thread-multi构建 这个问题源于这个问题。简单地说,我正在破解一个非常旧的Perl脚本,该脚本用于维护内部私有PKI,以便默认签名哈希和密钥大小满足当前浏览器的要求 我有以下代码片段: . . . $args->{keypass} = $self->getPassword("Private key password",1) unless $args->{keypass};

centos-6.8 perl,v5.10.1(*)为x86_64-linux-thread-multi构建

这个问题源于这个问题。简单地说,我正在破解一个非常旧的Perl脚本,该脚本用于维护内部私有PKI,以便默认签名哈希和密钥大小满足当前浏览器的要求

我有以下代码片段:

. . .    
$args->{keypass} = $self->getPassword("Private key password",1)
  unless $args->{keypass};    
$self->warn("# Password argument: $args->{keypass}\n") if $ENV{CSPDEBUG};
my $cmd = "-out $args->{keyfile} $args->{keysize}";
$cmd = "-des3 -passout pass:$args->{keypass} ".$cmd if defined($args->{keypass});
$self->{openssl}->cmd('genrsa',$cmd,$args);
. . .
$self->{openssl}->cmd('req',"-x509 $common_args -new -out $cacert",$args);
. . .
use IPC::Run qw( start pump finish timeout new_appender new_chunker);
. . .
sub cmd
  {
    my $self = shift;
    my $cmd = shift;
    my $cmdline = shift;
    my $args = shift;
    my $conf;
    my $cfgcmd;
. . .
    $self->{_handle}->pump while length ${$self->{_in}};
. . .
如果用户提供的密码参数值不包含空格,则此代码将按需要执行。如果它确实包含嵌入的空格,那么代码将以静默方式失败。如果传递给
keypass
的参数使用起始和结束单引号连接,则代码同样会以静默方式失败。在这两种失败的情况下,脚本仍然报告成功

为什么?


无论用户输入是否包含空格,都需要进行哪些更改才能使此代码正常工作?

要回答您的文字问题,请允许我:

run()
start()
harness()
都可以将线束规格作为输入。线束规格是要传递到系统外壳[…]的单个字符串或要执行的命令、io操作和/或计时器/超时的列表

要防止shell解析命令参数(当参数包含空格时,这会导致问题中断),不应将其作为单个字符串传递,而应将其作为对数组的引用传递,该数组将每个单独的参数作为单个字符串包含,如下所示:

my @cmd = ("-out", $args->{keyfile}, $args->{keysize});
unshift @cmd, ("-des3", "-passout", "pass:$args->{keypass}") if defined $args->{keypass};
# ...
my $h = start ["openssl", "genrsa", @cmd], \$in, \$out;  # or something equivalent
(您发布的代码似乎是通过某个自定义接口层使用IPC::Run;因为您没有向我们展示该层的确切外观,所以我将其替换为对IPC::Run::start的简单调用。)


在任何情况下,请注意,在命令行上传递密码通常被认为是不安全的:如果任何不受信任的用户可以在同一台服务器上运行代码(即使在非特权帐户下),他们只需运行
ps ax
,即可查看密码。注意到这一点,并警告说
pass:password
“仅应在安全性不重要的情况下使用。”

一个更安全的替代方案将是。方便的是,IPC::Run使这变得非常简单:

my @cmd = ("-out", $args->{keyfile}, $args->{keysize});
unshift @cmd, ("-des3", "-passout", "fd:3") if defined $args->{keypass};
# ...
my $h = start ["openssl", "genrsa", @cmd], '<', \$in, '>', \$out, '3<', \$args->{keypass};
my@cmd=(“-out”,$args->{keyfile},$args->{keysize});
unshift@cmd,(“-des3”,“-passout”,“fd:3”),如果定义为$args->{keypass};
# ...

我的$h=start[“openssl”,“genrsa”,“@cmd],'',\$out',3请让我回答正确的问题,您正在尝试从密码字段中删除任何空格,以确保它正常工作?或者特别是为了在密码中有空格的情况下也能工作?@user2082599从前面的问题和这里的描述中,我相信密码可能包含空格。如果是这样,程序将失败,因为空格在命令行参数中丢失。引用它不起作用。@James你能突出显示哪个参数是密码吗?这对我来说并不清楚。@simbabque:我很确定这是
$args->{keypass}
。顺便说一句,在命令行上传递密码通常被认为是不安全的:如果任何不受信任的用户可以在同一台服务器上运行代码(即使在没有特权的帐户下),他们只需运行
ps ax
,就可以看到密码。注意到这一点,并警告说
pass:
“应该只在安全性不重要的地方使用。”我遇到的困难是,这对我来说非常陌生。我正在入侵一个非常古老的第三方脚本,该脚本使用的语言我只知道粗略的知识;而他的原作者已经离开并抛弃了它。我需要对密钥大小的默认值进行一些小的更改,并更改签名哈希算法以满足当前的期望。不幸的是,我无意中遇到了这个问题,作为我,我希望得到一个合适的解决方案。简单的解决方法就是不要使用带有空格的短语。但是这似乎是错误的。@JamesB.Byrne:不幸的是,您需要修改的部分在您用
替换的代码中在你的问题中。具体地说,其中可能有一个IPC::Run
start()
调用,您需要修改它以获取数组引用而不是字符串。这可能至少需要基本熟悉Perl。如果你没有,你的选择基本上是1)抓起一本介绍Perl的好书并学习,2)找到比你更懂Perl的人,或者3)放弃,记录错误并继续。首先,我需要建立我们的替代PKI。目前看来,这不会是一个问题,因为我似乎已经克服或避开了我遇到的障碍。在我找到时间之前,重写代码以将整个程序从字符串参数切换到数组参数是不可能的,因为时间资源非常有限。我可以直接使用openssl更改密钥上的密码短语,这样可以得到所需的结果,并避免重新编程脚本——这一过程无疑会发现其他缺点。