pythonリストデータをMIMEのメール機能にどのように処理するか。以下は、システム上の "sshd
"プロセスを検索し、30分以上実行してから電子メールで報告する場合のような条件に基づいたスクリプトです。出力リダイレクトデータを電子メールに処理してリストに追加する方法
私はリダイレクト目的で "cStringIO
"モジュールを使用していますので、データはメール送信機能に呼び出すことができるdata_stream
変数に保持することができます。私は、それは別の部分に送信し、それが正しく、コンソール上で動作するスクリプトが、電子メールを実行したときので、私はすぐにスクリプトコードの後に以下の例を引用しています。..
問題の概要:
#!/usr/bin/python
from subprocess import Popen, PIPE
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import subprocess
import socket
import sys
import cStringIO
import re
mylist = list()
hst_name = (socket.gethostname())
def checK_ps():
ps = subprocess.Popen(['ps', '-eo' 'pid,user,args,etime='], stdout=subprocess.PIPE)
output = ps.communicate()[0]
for line in output.splitlines():
result = re.search(".*[\/\s]+(sshd:)\s+", line)
if result:
time_items = re.split('-|:',(line.split(' ')[-1]))
time_len = len(time_items)
mystdout = sys.stdout
data_stream = cStringIO.StringIO()
sys.stdout = data_stream
if time_len == 4:
print "Alert sshd: is running longer on the host",hst_name,time_items[0],"days:" # "-->",line.strip()
elif time_len == 3:
print "Alert sshd: is running longer on the host",hst_name,time_items[-3],"hours:" # "-->",line.strip()
elif time_len == 2 and int(time_items[-2]) >= 30:
print "Alert sshd: is running longer on the host",hst_name,time_items[-2],"minutes:" #, "-->",line.strip()
sys.stdout = mystdout
variable_data = data_stream.getvalue()
xxx = variable_data + line.strip() + "\n\n"
mylist.append(xxx)
mailp = Popen(["/usr/sbin/sendmail", "-t", "-oi"], stdin=PIPE)
msg = MIMEMultipart('alternative')
msg['To'] = "[email protected]"
msg['Subject'] = "Daily PS Check Report"
msg['From'] = "[email protected]"
msg1 = MIMEText(xxx, 'text')
msg.attach(msg1)
mailp.communicate(msg.as_string())
print "".join([str(x) for x in mylist])
checK_ps()
..私は、スクリプトを実行したとき、それはコマンドコンソールで大丈夫実行されますが、それは、電子メールを介して処理するとき、それは、これらの4つの異なる電子メールのメモを送信する以下の試験例のように例:テスト主な問題は、「アラート」以下のすべてが同じシステムからのすべてのプロセスとして1つの4つの異なる電子メールに送られることです。
$ ./testps.py アラートsshdは:ホストルート・カーンに長く実行されている01時間: 4536ルートのsshd:今すぐカーン[PRIV]一時03分21秒
Alert sshd: is running longer on the host root-karn 01 hours:
4621 karn sshd: [email protected]/1 01:03:11
Alert sshd: is running longer on the host root-karn 20 hours:
20124 root sshd: niraj [priv] 20:16:06
Alert sshd: is running longer on the host root-karn 20 hours:
20130 niraj sshd: [email protected]/2 20:16:05
私はリストを追加してそれを処理しようとしましたが、上記と同じように見えますが、どのように処理して1つの電子メールにすることができるのか不思議です。
要件: 1つのサーバーから1つの電子メールを受信し、そのプロセスをキャッチします。
ヒストリと提案を参考にしてください。
@私は本当に上のポストに専門家のアドバイスをしたいと思います。 – rockypy17
あなたは結果を見つけるたびに電子メールを送信します。あなたは 'for'ループの外に送信 –
一つの方法は、2つの方法の間で機能を分割するだろう取る必要があります。開いているプロセスをチェックし、結果を転送するために選択した 'list'、' dict'、またはwhather coolctionを返します。このコレクションをとり、電子メールを組み立てて送信するもう1つの方法です。 MaartenFabré@ –