Unix 명령에서 특수 문자 &, $, ^, *, !를 이스케이프합니다(bash perl).

Unix 명령에서 특수 문자 &, $, ^, *, !를 이스케이프합니다(bash perl).

기본적으로 RFC 5322 표준을 사용하여 uucp를 통해 다음을 포함한 일부 특수 계정으로 일부 이메일을 보내려고 합니다 !#$%&'*+-/=?^_`{|}~;.https://en.wikipedia.org/wiki/Email_address#Local-part)

CLI(/bin/bash) 및 Perl 스크립트를 통해 Centos 6 상자에서 다음 명령을 실행하려고 합니다.

# cat /root/my_msg | uux -r [email protected] - 'my_remailserv!rmoc.pl' [email protected]  "CP&[email protected]" [email protected]

이메일 주소를 전달하는 데 성공했지만 문자열을 다음으로 분할했습니다.Massimo.L'[email protected]"Massimo.L\'[email protected]"&CP & [email protected]

이러한 추가 2개의 공백을 피하는 방법에 대한 아이디어가 있습니까? 나는 만족스러운 결과를 얻지 못한 채 이것을 여러 번 시도했습니다."CP\&[email protected]" 'CP\&[email protected]'

답변1

쉘이 탈출해야 하는 것이 무엇인지 추측하는 대신, 쉘을 우회하기 위해 연결된 파이프의 핸들을 사용하십시오 uux.

open my $uux, '|-', 'uux', '-r', 
                           '[email protected]', 
                           '-', 
                           'my_remailserv!rmoc.pl', 
                           '[email protected]', 
                           'CP&[email protected]', 
                           '[email protected]' 
  or die $!;
open my $data, '<', '/root/my_msg' 
  or die $!;
print $uux (<$data>);
close $data 
  or die $!;
close $uux 
  or die $!;

(예제에서 복사한) 정적 문자열을 해당 perl 변수로 바꿀 수 있습니다. 여기서 기본 아이디어는 프로그램의 파이프 핸들을 열고 uux(원하는 모든 매개변수 제공) 메시지 내용에 대한 두 번째 핸들을 연 다음 두 번째 파일 핸들의 내용을 파이프에 인쇄하고 모든 것을 닫는 것입니다. .

이를 독립적으로 테스트하기 위해 로컬 "uux" 프로그램을 만들었습니다.

#!/bin/sh
echo I am "$0" with arguments:
printf '<%s>\n' "$@"
echo Here is stdin:
cat

두 줄로 구성된 샘플 데이터 파일 date. 이러한 실행의 출력 예는 다음과 같습니다.

$ ./go.pl
I am ./uux with arguments:
<-r>
<[email protected]>
<->
<my_remailserv!rmoc.pl>
<[email protected]>
<CP&[email protected]>
<[email protected]>
Here is stdin:
Thu Jun 27 14:20:46
Thu Jun 27 14:30:36

관련 정보