CentOS 6.3
Estoy tratando de obtener una pequeña secuencia de comandos para enviar un correo electrónico que contenga una copia de los encabezados del correo electrónico en el cuerpo (para fines de informes internos).
El archivo de plantilla contiene lo siguiente:
Alert Report
Alert has triggered at TMPDATE
HEADERS
-------
TMPHEADERS
SOURCE IP
---------
TMPSOURCEIP
Quiero que mi script encuentre y reemplace los marcadores de posición "TMP" con información real relevante para la alerta.
Las variables de fecha y fuente de IP parecen funcionar bien, pero si / cuando trato de encontrar / reemplazar los TMPHEADERS, causa síntomas extraños, incluida la salida completa en blanco. Estoy razonablemente seguro de que tiene que ver con los encabezados que contienen muchos caracteres especiales (@% & etc.).
¿Alguien puede aconsejar sobre la mejor manera de lograr esto a través de bash?
Mi código actual se ve así:
cat /test/emailtemplate | sed s/TMPHEADERS/"$HEADERS"/ > /test/output
ACTUALIZAR
Según la solicitud, aquí hay un conjunto de encabezados de ejemplo que estoy tratando de insertar en el archivo de plantilla (las direcciones IP y la dirección de correo electrónico se han cambiado para proteger a los 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"
fuente
Respuestas:
Esto es difícil en sed porque en
sed s/TMPHEADERS/"$HEADERS"/
, el valor de la variable se sustituye por el shell antes de que el comando llegue a sed, por lo que caracteres como&\/
ese aparecen en$HEADERS
tienen un significado especial en el texto de reemplazo. Sed no tiene un servicio de búsqueda variable.Esta tarea es bastante fácil con awk. Pase la
HEADERS
variable en el entorno:o como una variable awk:
fuente
Hay varias posibilidades:
sed Tendrías que escapar de cada char en "$ HEADERS" para que la llamada sed sea segura.
Por cierto: no hay absolutamente ninguna razón para llamar a sed una vez por cada cambio:
golpearse
fuente
sed
comandos (pensé que era necesario) y las variables bash no se expanden (quiero decir que 's / foo / $ bar /' realmente se imprime$bar
y no el contenido de la variable). Su comando funcionó bien sin las comillas (como lo había publicado) falló cuando lo puse entre comillas simples. Lo siento, fuerza de la costumbre, no dudes en retroceder mi edición.sed: -e expression #1, char 121: unterminated
s 'comando' Supongo que debo haber configurado el comando incorrectamente:sed "s/TMPHEADERS/$HEADERS_ESCAPED/" /home/foo/scripts/fooalert/emailtemplate > /home/foo/scripts/fooalert/testing1234
he confirmado que los encabezados ahora se han escapado correctamente.No estoy seguro de entender lo que quieres hacer. Si desea, por ejemplo, reemplazar la cadena
TMPHEADERS
con la larga lista de información de encabezado que publicó, esta solución de Perl puede hacerlo:El archivo
template
es la plantilla de su pregunta y el archivoheader
tiene las líneas de encabezado que publicó. El resultado esPuede extender esto para dos conjuntos de encabezados de la siguiente manera:
fuente
Usando el
m4
procesador de macro para reemplazarTMPSOURCEIP
yTMPDATE
con cosas definidas en la línea de comando yTMPHEADERS
con lo que sea que esté en el archivoheaders.txt
. La plantilla está adentrotemplate.txt
.Si ya tiene los encabezados en una variable, obviamente puede reemplazar
-DTMPHEADERS='include(headers.txt)'
con-DTMPHEADERS="$headers"
.fuente