“echo” html 内容到 perl 中的文件

“echo” html 内容到 perl 中的文件

我经常在 perl 中使用“echo $xxx >file”,通常用于调试。它丑陋但简单,它符合“There's More Than One Way To Do It”。

但现在我有一个问题@_@_包含一个网页。

`echo "@_" >/tmp/curl`;
`echo """@_""" >/tmp/curl`;

sh: -c: line 5: syntax error near unexpected token `<'
sh: -c: line 5: ` <meta description="

`echo "'"@_"'" >/tmp/curl`;
`echo '"'@_'"' >/tmp/curl`;

sh: -c: line 0: syntax error near unexpected token `newline'
sh: -c: line 0: `echo "'"<html>'

我想知道这是否可以做到。

ps:我测试过 bash,它可以在终端中运行。

r='<meta description="Ch<br><br>This'; echo $r >/tmp/curl

但perl不能。

#!/usr/bin/perl
$r='<meta description="Ch<br><br>This';
`echo "$r" >/tmp/curl`; exit;

我认为这里有一些技巧可以做到这一点。

答案1

哦,亲爱的,不。您对反引号所做的就是生成一个 shell,只是为了将某些内容打印到文件中。正如您所注意到的,特殊字符会引起问题,并允许注入命令。理论上,您可以转义 shell 认为特殊的所有内容,但这样做很烦人。

只需使用正确的文件处理函数并创建一个函数来包含所有步骤:

sub dumptofile($@) {
    my $file = shift;
    if (open F, ">", $file) {
        print F @_;
        close F; 
    } else {
        warn "Can't open $file: $!"
    }
}

dumptofile("/tmp/curl", "some output\n");

现在,如果您不想输入所有内容,您可以将其压缩为更丑陋的内容,忽略错误检查和所有内容(如我的第一个版本)。或者将完整版本保存在模块中并将其放在 Perl 的包含路径中的某个位置(perl -I)。

# Dumptofile.pm
package Dumptofile;
use strict;
use warnings;
use Exporter qw/import/;
our @EXPORT = qw/dumptofile/;

sub dumptofile($@) {
    my $file = shift;
    if (open my $fh, ">", $file) {
        print $fh @_;
        close $fh; 
    } else {
        warn "Can't open $file: $!"
    }
}
1;

使用:

perl -MDumptofile -e 'dumptofile("out.txt", "blahblah");

答案2

我找到了。抱歉,我喜欢肮脏的 Perl...

`echo \'@_\' >/tmp/curl`;

谢谢你提醒我,拉克什·夏尔马。我将代码更改为此。

push @_, 'that "is"you\'ok.'; 
for(@_){s/'/"/g;}; `echo \'@_\' >/tmp/curl`;

相关内容