我的 python 脚本不会从 bash 脚本导出我的变量



我正在做一个学校项目,没有太多时间完成。我找不到解决方案。我读了很多参考资料,但我不是一个开发人员。下面的代码有一半不是我写的,这就解释了为什么我找不到解决方案。

我的问题:

我必须在bash中收集来自Iptables的拒绝(使用日志),并在Python中制作一个非常简单的实时图。

我已经做到了:

在bash中

#!/bin/sh
for i in {1..10}
do
p22=`cat  /var/log/messages | grep 'MONFIREWALL' |grep DPT="22"  | wc -l`
p80=`cat  /var/log/messages | grep 'MONFIREWALL' |grep DPT="8080"| wc -l`
p12=`cat  /var/log/messages | grep 'MONFIREWALL' |grep DPT="12" | wc -l`
p123=`cat  /var/log/messages | grep 'MONFIREWALL' |grep DPT="123" | wc -l`
p1234=`cat  /var/log/messages | grep 'MONFIREWALL' |grep DPT="1234" | wc -l`
echo "Le port n°22   a subit " $p22 "attaque(s)" 
echo "Le port n°80   a subit " $p80 "attaque(s)"
echo "Le port n°12   a subit " $p12 "attaque(s)"
echo "Le port n°123  a subit " $p123 "attaque(s)"
echo "Le port n°1234 a subit " $p1234 "attaque(s)"
echo "------------ REFRESH -----------"
sleep 5
done

在Python中:

import matplotlib.pyplot as plt
import matplotlib.animation as animation
import time
import os
fig = plt.figure()
ax1 = fig.add_subplot(1,1,1)
def animate(i):
pullData = open("sampleText.txt","r").read()
dataArray = pullData.split('n')
xar = []
yar = []
for eachLine in dataArray:
if len(eachLine)>1:
x,y = eachLine.split(',')
xar.append(int(x))
yar.append(int(y))
ax1.clear()
ax1.plot(xar,yar)
ani = animation.FuncAnimation(fig, animate, interval=1000)
plt.show()

我不知道如何将bash变量放在PullData中,而放在.txt文件中。

我得到的变量是这样的:

import os
x22=os.environ['p22']

如果有人能帮我,我会很高兴的。对不起我的英语;我是法国人。

您的bash脚本必须导出变量才能将它们放入主环境空间。从那里,Python的os.environ调用将能够找到值。在您的最后一个代码部分中,请尝试打印x22以检查它是否工作。

看看您试图实现的目标,即动态更新的图,我建议您不能用环境变量来实现。您可以从父shell设置和导出它们,但是,父shell和子shell的环境是独立的,因此在父shell中所做的任何更改在子shell中都不可见。

您可以在Python中实现bash脚本功能,但我认为您必须使用bash脚本。一种方法是让bash脚本写入"pull data"文件,然后Python脚本读取该文件并绘制图形,就像目前一样。这种方法会有问题,因为Python脚本可能在更新文件时读取文件,从而接收不完整或混合的值。有一些方法可以同步访问,但是,这很麻烦。

更好的方法是从Python中调用bash脚本。bash脚本会将数据写入其标准输出,Python可以读取并生成图形,而无需担心bash脚本在处理过程中会覆盖它。您可以使用subprocess.check_ouput()(如果使用Python>=3.5,则使用subprocess.run()):

bash脚本

#!/bin/sh
PORTS="22 8080 12 123 1234"    
for port in $PORTS
do
count=$(grep "MONFIREWALL.*DPT=$port" /var/log/messages | wc -l)
echo "$port,$count"
done

然后在Python脚本中,通过如下更改animate()的前几行来调用脚本(假设它被命名为count_rejects,sh):

from subprocess import check_output
COUNT_REJECTS = '/path/to/count_rejects.sh'
def animate(i):
data = check_output([COUNT_REJECTS])
dataArray = data.split('n')
...

Python代码还可以进行一些其他改进,例如,在绘图之前应该对图形数据进行排序,但这应该足以让您继续工作。

您可能希望使用条形图而不是图形。

相关内容

  • 没有找到相关文章