Попытка создать электронную почту с новыми строками от Python до Bash команды mailx - PullRequest
0 голосов
/ 08 мая 2020

Там, где я работаю, у нас есть серверы, которые предварительно настроены для использования команды bash mail для отправки вложений и сообщений. Я работаю над сценарием уведомления, который будет отслеживать активность сервера и генерировать электронное письмо, если обнаружит проблему. Я использую функцию subprocess.call, чтобы отправить команду bash.

Я успешно отправляю сообщения, но в основной части электронного письма каждая строка уведомления объединяется, а не вынесение каждого уведомления в отдельную строку. Я попытался добавить к каждой строке в строке «\ n» и «\ r \ n». Я должен использовать двойную обратную косую черту, поскольку python будет интерпретировать это как буквальные новые строки, когда он отправляет команду echo. Я также передал команду «shopt -s xpg_echo» перед тем, как использовать эхо с конвейером для отправки по почте с использованием двойных пробелов, но это также не имело никакого эффекта. Я также пробовал использовать echo без опции «-e», и это тоже не имело никакого эффекта.

Хитрость в том, что мне нужно python, чтобы отправить новую строку на bash, а затем каким-то образом получить bash чтобы интерпретировать это как новую строку, используя эхо, передаваемое по почте. Вот пример кода:

import os
import shutil
import sys
import time
import re
import subprocess
import smtplib

serviceports["SCP Test"] = ["22"]
serviceports["Webtier"] = ["9282"]

bashCommand = "netstat -an | grep LISTEN | grep -v LISTENING"
netstat_results = subprocess.check_output(bashCommand, shell=True)
netstat_results = str(netstat_results)

#Iterate through all ports for each service and assign down ports to variable

for servicename, ports in serviceports.items():
  for ind_port in ports:
    ind_port_chk = ":" + ind_port
    count = sum(1 for _ in re.finditer(r'\b%s\b' % re.escape(ind_port_chk), netstat_results))
    if count == 0:
      warning = servicename + " on port " + ind_port + " is currently down!"
      report.append(warning)

for warning in report:
  message = message + warning + "\\\n"

fromaddr=serveridsimp + "@xxxxx.com"
toaddr='email@xxxxx.com'
subject="Testing..."
body=message
cmd= cmd='echo -e '+body+' | mail -s '+subject+' -r '+fromaddr+' '+toaddr
send=subprocess.call(cmd,shell=True)

Код запускает команду netstat и присваивает ее строке. Затем код будет перебирать указанные порты и искать, где этот порт не существует, в строке netstat (netstat_results). Затем он создаст объект списка (предупреждение), содержащий все порты, не указанные в netstat_results, а затем добавит каждую строку, добавляя \ n к строке с именем «message». Затем он отправляет эхо-сообщение команде xmail для создания электронного письма, содержащего все не найденные порты. В настоящее время я получаю электронное письмо, в котором говорится примерно следующее: SCP Test на порту 22 в настоящее время не работает! NOHS Webtier на порту 9282 в настоящее время не работает! N et c ...

Я хочу это помещать каждое сообщение в новую строку, например:

  • Тест SCP на 22-м порту в настоящее время не работает!
  • Webtier на порту 9282 в настоящее время не работает!

Я пытаюсь не записывать вывод в файл, а затем использовать bash, чтобы прочитать его обратно в почтовую команду. Возможно ли это без создания файла?

1 Ответ

0 голосов
/ 11 мая 2020

Я наконец смог решить проблему, изменив команду, отправленную на bash, и добавив символ к следующему:

    message = message + warning + "\n"

cmd= cmd='echo -e '+'"'+body+'"'+'|awk \'{ print $0"   " }\''+' | mail -s '+'"'+subject+'"'+' -r '+fromaddr+' '+toaddr
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...