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(必要なすべてのパラメータを指定して)、メッセージ内容の2番目のハンドルを開き、2番目のファイルハンドルの内容をパイプに印刷してすべてを閉じることです。 。

これを独立してテストするためにローカルの「uux」プログラムを作成しました。

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

2行のサンプルデータファイル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

おすすめ記事