我正在尝试从包含某个端口号的“Openvas”的“*.nasl”中 grep 文件列表。
我可以使用以下命令直接在终端中创建它:
egrep --only-match '111' /home/gwvm/Openvas/var/lib/openvas/plugins/*.nasl |cut -d ":" -f1
此命令返回包含 111 的 nasl 文件的所有名称。
喜欢 :
/home/gwvm/Openvas/var/lib/openvas/plugins/SolarWinds_TFTP.nasl:111
/home/gwvm/Openvas/var/lib/openvas/plugins/trojan_horses.nasl:111
切割后:
/home/gwvm/Openvas/var/lib/openvas/plugins/SolarWinds_TFTP.nasl
/home/gwvm/Openvas/var/lib/openvas/plugins/trojan_horses.nasl
但是当我在 python(3.1.3) 中时,输出给了我一个错误:
egrep:/home/gwvm/Openvas/var/lib/openvas/plugins/*.nasl: No such file or directory
由于“*.nasl”,我正在考虑一个问题,但是当我尝试使用现有文件时,结果相同。
这是代码的一部分:
command = ("egrep --only-match '"+ str(port[0]) +"' "+ openvas_directory["locate"]["nasl"] + '*.nasl' + ' |cut -d ":" -f1 ')
process=sp.Popen(command,shell=True, stdout= sp.PIPE)
或者
exec(command)
我也在考虑一个糟糕的结构,但我正在打印命令,它给了我我想要的:
egrep --only-match '111' /home/gwvm/Openvas/var/lib/openvas/plugins/*.nasl |cut -d ":" -f1
如果有任何想法!
最佳答案
from subprocess import PIPE, Popen
x = Popen('egrep --only-match \'111\' /home/gwvm/Openvas/var/lib/openvas/plugins/*.nasl', stdout=PIPE, stderr=PIPE, shell=True)
y = Popen('cut -d ":" -f1', stdin=x.stdout, stdout=PIPE, stderr=PIPE, shell=True)
for row in y.stdout.readline():
print row
或者只使用
check_output()
顺便说一句,这就是你如何在 Popen 中使用 |
;)指南:
使用
Popen
时,如果将命令作为字符串提供,请使用 shell=True
。但是,如果您为
Popen
提供一个列表 ['ls, '-l']
然后使用 shell=False
,这就是它的工作原理。如果您正在传输数据,请执行两个不同的
Popen
并使用第一个命令的输出作为第二个命令的 stdin,这与在 Linux 中执行 |
是等效的。关于Python exec grep,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16398565/