1

我有一个 Perl 脚本,可以从 Web 表单中读取一些信息。为了进行适当的清理,我想使用此处system描述的语法。

他们建议您应该以以下形式形成系统命令,system ("cat", "/usr/stats/$username");以便用户名变量只会被解释为 cat 的参数。

如果我有一个system("export REPLYTO=\"$from\"; echo \"$body\" | mail -s \"$subject\"");具有多个系统命令形式的命令,我该如何正确清理系统调用?

4

1 回答 1

5

在开始之前,请注意您可以export在 Perl 中通过设置$ENV{REPLY_TO}.


选项1。

您可以使用String::ShellQuoteshell_quote.

use autodie qw( :all );
my $cmd = shell_quote('echo', $body) .
    '|' . shell_quote('mail', '-s', $subject);
local $ENV{REPLY_TO} = $from;
system($cmd);

选项 2。

通过 env var 传递所有内容。

use autodie qw( :all );
local $ENV{REPLY_TO} = $from;
local $ENV{SUBJECT}  = $subject;
local $ENV{BODY}     = $body;
system('echo "$BODY" | mail -s "$SUBJECT"');

选项 3。

摆脱echo

use autodie qw( :all );
local $ENV{REPLY_TO} = $from;
open(my $pipe, '|-', 'mail', '-s', $subject);
print($pipe $body);
close($pipe);
die "Child died from signal ".($? & 0x7F)."\n" if $? & 0x7F;
die "Child exited from error ".($? >> 8)."\n" if $? >> 8;
于 2013-04-23T17:50:29.510 回答