CentOS 6.3
Estou tentando obter um pequeno script para enviar um email contendo uma cópia dos cabeçalhos do email no corpo (para fins de relatórios internos).
O arquivo de modelo contém o seguinte:
Alert Report
Alert has triggered at TMPDATE
HEADERS
-------
TMPHEADERS
SOURCE IP
---------
TMPSOURCEIP
Desejo que meu script encontre e substitua os marcadores de posição "TMP" por informações reais relevantes para o alerta.
As variáveis de IP de data e origem parecem funcionar bem, mas se / quando eu tentar encontrar / substituir os TMPHEADERS, causará sintomas estranhos, incluindo toda a saída em branco. Estou razoavelmente certo de que isso tem a ver com os cabeçalhos que contêm muitos caracteres especiais (@% & etc).
Alguém pode aconselhar sobre a melhor forma de fazer isso via bash?
Meu código atual é assim:
cat /test/emailtemplate | sed s/TMPHEADERS/"$HEADERS"/ > /test/output
ATUALIZAR
Conforme a solicitação, aqui está um exemplo de conjunto de cabeçalhos que estou tentando inserir no arquivo de modelo (os endereços IP e o endereço de email foram alterados para proteger os inocentes :-)):
From [email protected] Thu Apr 25 20:18:19 2013
Return-Path: <[email protected]>
Received: from nm30-vm0.bullet.mail.ne1.yahoo.com (nm30-vm0.bullet.mail.ne1.yahoo.com [98.138.11.36])
by serv.example.com (8.14.4/8.14.4) with ESMTP id r3Q3IJVV009411
for <[email protected]>; Thu, 25 Apr 2013 20:18:19 -0700
Received: from [108.108.108.108] by nm30.bullet.mail.ne1.yahoo.com with NNFMP; 26 Apr 2013 03:18:19 -0000
Received: from [98.138.87.11] by tm15.bullet.mail.ne1.yahoo.com with NNFMP; 26 Apr 2013 03:18:17 -0000
Received: from [127.0.0.1] by omp1001.mail.ne1.yahoo.com with NNFMP; 26 Apr 2013 03:18:17 -0000
X-Yahoo-Newman-Property: ymail-3
X-Yahoo-Newman-Id: [email protected]
Received: (qmail 29701 invoked by uid 65501); 26 Apr 2013 03:18:17 -0000
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s1024; t=1366946297; bh=yjMzVONHAyJxQob7tLNdIN2RpfGHWVw1Kb5Qr+enYF8=; h=X-YMail-OSG:Received:X-Rocket-MIMEInfo:X-Mailer:Message-ID:Date:From:Reply-To:Subject:To:MIME-Version:Content-Type; b=CQGilBx8NertE4j75dsfsdfs+IKRzIx5vlH5YdzqFLd4ThfEyMs11sdfsdfsdXsAH1yteACnwSER+QXJQ80BfLGbJnIWm+29I8A4geOPIHGKoOUCnPaD+/0bHfAps0JIcwEju8Tcvg4VDVWw=
DomainKey-Signature:a=rsa-sha1; q=dns; c=nofws;
s=s1024; d=yahoo.com;
h=X-YMail-OSG:Received:X-Rocket-MIMEInfo:X-Mailer:Message-ID:Date:From:Reply-To:Subject:To:MIME-Version:Content-Type;
b=5TIRL55VM2J2lPLsX9iCE4sdlkfjlEM2245M6qzg1oGrnZd61ykL4xQSsc3cYNz95fwNy67aRRC89n6xcti28ee5rjmlK0MDIskSB5sKlv165mNjmzF1LNx6uFXalI8QGSwiQt2uWLYvI7RrTVeZFELDfFVZyqygEl5k=;
X-YMail-OSG: EDT4ym4VM1lVQMdtAQ5zqfE59jR1Mtip4vVL1fBzNxFdGvA
YjAJ3MXC1EusloknrsPx3drxzR1b4PFErK.UhdgWePhK7TTCHhhju4XP4i7x
76WASceqp77T5itvZmilv5UuICJw3BCEd0fdADctfBYhLNwoALxjp6cnJMmE
Z4dYVtlp5vUFqg1pHxqGOXqrtjeZffM4dMftnn.Q8LlVEkj3pZ6ZJV_kKFtj
vGEGS5PAW0tIHWPEqVERYzmDOfF5sVSQLayPi6EM_i1OE038434laijEWbH0
nZt1Vkg3syO0t1BaTLN4B1bXeS8cv3GlbLO4ot7zVwA3sH4UhsC5M6xiWNFU
3iroObJ5BObL99VO3ktvC4KzekAWJ_fE85TQJhQKj6Iolgb4xlWa2x414xuA
awO4pJI9grDjycUcmhmKwLZEt_.0OBLfSi5MSviaiCNMuU5qIdHm7VCGdORP
Mc68rDkpmJE9I9Z.QZfhH5cFxqqmpyIOMTs0iIBGYz5d9QHMWCuo-
Received: from [102.102.102.102] by web12341105.mail.ne1.yahoo.com via HTTP; Thu, 25 Apr 2013 20:18:17 PDT
X-Rocket-MIMEInfo: 002.001,VGVzdGluZyAxMjMgTGEgbGEgbGEBMAEBAQE-
X-Mailer: YahooMailWebService/0.8.141.536
Message-ID: <[email protected]>
Date: Thu, 25 Apr 2013 20:18:17 -0700 (PDT)
From: Test Account <[email protected]>
Reply-To: Test Account <[email protected]>
Subject: Test
To: "[email protected]" <[email protected]>
MIME-Version: 1.0
Content-Type: multipart/alternative; boundary="102743210-1541163991-1366946297=:49149"
fonte
Respostas:
Isso é difícil no sed porque em
sed s/TMPHEADERS/"$HEADERS"/
, o valor da variável é substituído pelo shell antes que o comando atinja o sed, portanto caracteres como&\/
esse aparecem em$HEADERS
um significado especial no texto de substituição. O Sed não possui um recurso de pesquisa variável.Essa tarefa é bastante fácil com o awk. Passe a
HEADERS
variável no ambiente:ou como uma variável awk:
fonte
Existem várias possibilidades:
sed Você precisaria escapar de todos os caracteres em "$ HEADERS" para tornar a chamada sed segura.
BTW: Não há absolutamente nenhuma razão para chamar sed uma vez para cada alteração:
bater em si
fonte
sed
comandos (pensei que era necessário) e as variáveis bash não são expandidas (quero dizer que s / foo / $ bar / 'realmente é impresso$bar
e não o conteúdo da variável). Seu comando funcionou bem sem as aspas (como você o postou) falhou quando o coloquei entre aspas simples. Desculpe, força do hábito, sinta-se livre para reverter minha edição.sed: -e expression #1, char 121: unterminated
s 'command` Acho que devo ter configurado o comando errado:sed "s/TMPHEADERS/$HEADERS_ESCAPED/" /home/foo/scripts/fooalert/emailtemplate > /home/foo/scripts/fooalert/testing1234
confirmei que os cabeçalhos agora estão todos escapados corretamente.Não sei se entendi o que você quer fazer. Se você deseja, por exemplo, substituir a string
TMPHEADERS
pela longa lista de informações do cabeçalho que você postou, esta solução Perl pode fazê-lo:O arquivo
template
é o modelo da sua pergunta e o arquivoheader
tem as linhas do cabeçalho que você postou. O resultado éVocê pode estender isso para dois conjuntos de cabeçalhos da seguinte maneira:
fonte
Usando o
m4
processador de macro para substituirTMPSOURCEIP
eTMPDATE
com as coisas definidas na linha de comando eTMPHEADERS
com o que estiver no arquivoheaders.txt
. O modelo está emtemplate.txt
.Se você já possui os cabeçalhos em uma variável, obviamente pode substituir
-DTMPHEADERS='include(headers.txt)'
por-DTMPHEADERS="$headers"
.fonte