3

我正在尝试从“Openvas”的“*.nasl”中获取包含某个端口号的文件列表。

我可以使用以下命令直接在终端中制作:

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

如果有什么想法!

4

1 回答 1

2
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的 's 并将第一个命令的输出用作第二个命令的标准输入,这与|在 Linux 中执行的操作等效。

于 2013-05-06T12:19:24.223 回答