Там, где я работаю, у нас есть серверы, которые предварительно настроены для использования команды 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, чтобы прочитать его обратно в почтовую команду. Возможно ли это без создания файла?