subprocess.Popen错误:不可迭代

时间:2018-05-22 20:15:44

标签: python

我有一个让我疯狂的问题,我开始为我的工作创建一些有用的脚本..在python 2.7脚本编写..我正在阅读一本名为“Python for Unix and Linux administrators ...”的书,我知道我应该是在python 3中编程但是目前Python 2.7给了我解决方案..所以即时创建一个使用子进程模块的脚本。

import subprocess
from subprocess import PIPE, Popen


nmap = "nmap"
argumento_nmap = "-p"
port_nmap = "22"
port2_nmap = "2104"
open_port = "open"
closed_port = "closed"
ip_nmap = "192.168.170.52"

escaneo = subprocess.Popen([nmap,argumento_nmap,puerto_nmap,ip_nmap],         
stdout=PIPE)
print(escaneo.communicate()[0].split())
scan_result = escaneo
if port_nmap in scan_result:
    print " Puerto abierto"

在我的脑海里......如果open_port(22)打开或关闭,脚本应该验证..但每次运行代码我都会得到下一个错误:
    TypeError:'Popen'类型的参数不可迭代 ..在网上搜索我发现了一些函数,如check_output(),但它们没有帮助我..有没有办法检查该变量是否进入scan_result列表?

抱歉,我的英语很差,我希望你们遇到问题......

迎接

埃斯特

2 个答案:

答案 0 :(得分:1)

你得到的具体错误是因为x in y期望y是一个迭代器,python将在x中搜索。我想你要设置scan_result = escaneo.communicate()[0]。这将返回带有stdout的字符串,因此if port_nmap in scan_result:将起作用。但是,如果字符串'22'出现在字符串中的任何位置,它将返回true,因此您可能希望像在print语句中那样进行拆分。

答案 1 :(得分:0)

回答我的问题@rcriii我可以针对我遇到的问题进行更多的研究并找到一个解决方案.... scan_result = escaneo.communicate[0]该代码对我没有用..它给了我下一个错误:{{1但是你的回答让我有力量研究更多..所以在凌晨3点我能得到我想要的东西..这里是代码

TypeError: 'instancemethod' object has no attribute '__getitem__'
先生!如果您有任何建议,请

greetz

埃斯特