转义特殊字符 &、$、^、*、!在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

不要猜测 shell 需要转义(或不需要)什么,而是使用连接到的管道的句柄绕过 shell 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

相关内容