【发布时间】:2013-05-06 12:15:13
【问题描述】:
我正在尝试从“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
如果有什么想法!
【问题讨论】:
-
shell=False从不True如果您要提供列表。True用于命令字符串而不是列表。 -
我不认为你可以像现在这样在单个
Popen中传递命令。 -
好的,我已经修改了这一点!不管有没有管道,结果都是一样的。
-
是的,您可以通过管道传递
Popen字符串,只是不能在任何地方使用|,除非您在Popen 执行程序中打开一个shell,这会适得其反(但可能)。我的解决方案对@G.M 有帮助吗? -
nope >
标签: python exec subprocess grep