CentOS 6.3
Я пытаюсь получить небольшой скрипт для отправки электронного письма, содержащего копию заголовка письма в теле (для целей внутренней отчетности).
Файл шаблона содержит следующее:
Alert Report
Alert has triggered at TMPDATE
HEADERS
-------
TMPHEADERS
SOURCE IP
---------
TMPSOURCEIP
Я хочу, чтобы мой сценарий нашел и заменил заполнители «TMP» актуальной информацией, относящейся к предупреждению.
IP-переменные даты и источника, кажется, работают нормально, но если / когда я пытаюсь найти / заменить TMPHEADERS, это вызывает странные симптомы, включая весь вывод, чтобы быть пустым. Я вполне уверен, что это связано с заголовками, содержащими много специальных символов (@% и т. Д.).
Кто-нибудь может посоветовать, пожалуйста, как лучше всего это сделать с помощью bash?
Мой текущий код выглядит так:
cat /test/emailtemplate | sed s/TMPHEADERS/"$HEADERS"/ > /test/output
ОБНОВИТЬ
Согласно запросу, вот пример набора заголовков, которые я пытаюсь вставить в файл шаблона (IP-адреса и адрес электронной почты были изменены, чтобы защитить невинных :-)):
From foo@yahoo.com Thu Apr 25 20:18:19 2013
Return-Path: <foo@yahoo.com>
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 <test@example.com>; 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: 92334348.43667.bm@omp10122422401.mail.ne1.yahoo.com
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: <136634397.44849.YahooMailNeo@web126205.mail.ne1.yahoo.com>
Date: Thu, 25 Apr 2013 20:18:17 -0700 (PDT)
From: Test Account <foo@yahoo.com>
Reply-To: Test Account <foo@yahoo.com>
Subject: Test
To: "test@example.com" <test@example.com>
MIME-Version: 1.0
Content-Type: multipart/alternative; boundary="102743210-1541163991-1366946297=:49149"
источник
Ответы:
Это сложно в sed, потому что в
sed s/TMPHEADERS/"$HEADERS"/
, значение переменной подставляется оболочкой до того, как команда достигает sed, поэтому такие символы, как&\/
в этом,$HEADERS
имеют особое значение в тексте замены. Sed не имеет возможности поиска переменной.Эта задача довольно проста с awk. Передайте
HEADERS
переменную в среде:или как переменная awk:
источник
Есть несколько возможностей:
sed Вы должны будете избегать каждого символа в $ HEADERS, чтобы сделать вызов sed безопасным.
Кстати: нет абсолютно никакой причины вызывать sed один раз для каждого изменения:
сам по себе
источник
sed
команды (я думал, что это было необходимо), и переменные bash не раскрываются (я имею в виду, что 's / foo / $ bar /' фактически печатается,$bar
а не содержимое переменной). Ваша команда работала нормально без кавычек (как вы их опубликовали), она провалилась, когда я поместил ее в одинарные кавычки. Извините, сила привычки, не стесняйтесь откатить мою правку.sed: -e expression #1, char 121: unterminated
s 'command` Я полагаю, что я неправильно настроил команду:sed "s/TMPHEADERS/$HEADERS_ESCAPED/" /home/foo/scripts/fooalert/emailtemplate > /home/foo/scripts/fooalert/testing1234
я подтвердил, что теперь все заголовки экранированы правильно.Я не уверен, что понимаю, что вы хотите сделать. Если вы хотите, например, заменить строку
TMPHEADERS
длинным списком размещенной вами информации заголовка, это решение Perl может сделать это:Файл
template
является шаблоном вашего вопроса, и в немheader
есть строки заголовка, которые вы разместили. РезультатВы можете расширить это для двух наборов заголовков следующим образом:
источник
Использование
m4
макропроцессора для заменыTMPSOURCEIP
и тем,TMPDATE
что определено в командной строке, и тем,TMPHEADERS
что находится в файлеheaders.txt
. Шаблон находится вtemplate.txt
.Если у вас уже есть заголовки в переменной, вы, очевидно, можете заменить
-DTMPHEADERS='include(headers.txt)'
на-DTMPHEADERS="$headers"
.источник