나는 종종 디버깅을 위해 Perl에서 "echo $xxx >file"을 사용합니다. 보기 흉하지만 단순하며 "이를 수행하는 방법은 여러 가지가 있습니다."라는 원칙에 부합합니다.
하지만 이제 질문이 있습니다 @_
. @_
웹페이지가 포함되어 있습니다.
`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>'
이것이 가능한지 알고 싶습니다.
추신: bash를 테스트했는데 터미널에서 작동합니다.
r='<meta description="Ch<br><br>This'; echo $r >/tmp/curl
하지만 펄은 그럴 수 없습니다.
#!/usr/bin/perl
$r='<meta description="Ch<br><br>This';
`echo "$r" >/tmp/curl`; exit;
나는 이것을 하기 위한 몇 가지 트릭이 있다고 생각합니다.
답변1
아, 아니. 백틱을 사용하여 수행하는 작업은 파일에 무언가를 인쇄하기 위해 쉘을 생성하는 것뿐입니다. 아시다시피 특수 문자는 문제를 일으킵니다.명령 주입을 허용합니다.. 이론적으로는 쉘이 특별하다고 간주하는 모든 것을 피할 수 있지만 그렇게 하면 성가신 일입니다.
올바른 파일 처리 함수를 사용하고 모든 단계를 포함하는 함수를 생성하세요.
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`;
상기시켜주셔서 감사합니다, Rakesh Sharma. 내 코드를 이것으로 변경했습니다.
push @_, 'that "is"you\'ok.';
for(@_){s/'/"/g;}; `echo \'@_\' >/tmp/curl`;