Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中不存在向文件中添加行的情况_Python_Linux_Loops - Fatal编程技术网

python中不存在向文件中添加行的情况

python中不存在向文件中添加行的情况,python,linux,loops,Python,Linux,Loops,因此,我要做的是首先读取/var/log/secure文件,查找我要阻止的IP地址,并将该列表保存到一个文件中。然后我尝试读取该文件并确定该地址是否在美国境外,如果在美国境外,则我希望在iptables中阻止该地址 在写入之前,我还想预先确定该地址是否已添加到iptables中: #!/usr/bin/env python import GeoIP import os os.system("cat /var/log/secure | grep 'Failed password for inv

因此,我要做的是首先读取/var/log/secure文件,查找我要阻止的IP地址,并将该列表保存到一个文件中。然后我尝试读取该文件并确定该地址是否在美国境外,如果在美国境外,则我希望在iptables中阻止该地址

在写入之前,我还想预先确定该地址是否已添加到iptables中:

#!/usr/bin/env python

import GeoIP
import os

os.system("cat /var/log/secure | grep 'Failed password for invalid user' | grep -oE '((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])' >> /home/user/ipaddresses.txt")

iptables_file = open('/etc/sysconfig/iptables', 'r')
loglist = iptables_file.readlines()
iptables_file.close()
found = False

gi = GeoIP.new(GeoIP.GEOIP_MEMORY_CACHE)

for line in file("/home/user/ipaddresses.txt", "r"):
    line = line[:-1] # strip the last from the line
    #print line, "-", gi.country_code_by_addr(line)

    if str(gi.country_code_by_addr(line)) != "US":
            for ip in loglist:
                    if str(line) in line:
                            print str(line) + " found in iptables, skipping ip address"
                            break
            else:
                    print "adding " + str(line) + " to iptables"
                    #os.system("iptables -A INPUT -s " + str(line) + " -j DROP")

#os.system("service iptables save")
显然,我不想写我的iptables,直到我知道它的工作,所以这就是为什么我有它的评论了。我做错了什么? 这就是错误:

grep: write error
cat: write error: Broken pipe

第二个grep命令:

grep-oE'((1?[0-9]…[0-5])”/var/log/secure


将/var/log/secure作为参数。该参数不应存在。它正在读取文件,而不是读取标准输入,这是导致错误的原因。

您是否尝试过该命令(在os.system调用中)在命令行上?为什么你们都要将输入传送到grep,并在命令行上传递一个文件?你们有权限写入该输出文件吗?@GreenAsJade是的,我在首先读取iptables之前尝试了os.system调用。我以root用户身份运行它,所以我有正确的权限,并且我chmod+x文件以确保这一行运行正常“if str(line)in line”在“if not found”中出错,请注释掉os.system()调用,看看它是否仍然失败。这将是相当令人惊讶的。@GreenAsJade我相信它被注释掉了我不相信这会导致grep说“write error”@nortoon它打印到ipaddress.txt文件刚刚好我在我的机器上使用了一个类似的命令复制了它,它是grep说的。问题是命令管道没有做你认为它正在做的事情。cat和第一个grep基本上被忽略了。命令行上的第二个grep正在从它的参数处理安全文件,而不是s标准输入。所以任何与最后一个grep匹配的内容都在打印,没有“失败密码”的过滤器,第一个grep是“失败密码”正在写入管道。在某个点上,管道填满,第一个grep在写入时阻塞。第二个grep处理文件并退出,但从未读取管道。当它退出时,第一个grep的阻塞写入返回错误代码。如果使用小文件,则看不到它,因为第一个grep写入缓冲区并在管道buf之前完成FER已满。如果队列中的str(线路)可疑。您是指队列中的str(ip)吗?