基本上,我尝试使用 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