【问题标题】:Python exec grepPython 执行 grep
【发布时间】: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


【解决方案1】:
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,并将第一个命令的输出用作第二个命令的标准输入,这相当于在 Linux 中执行|

【讨论】:

  • 嗯,解决方案看起来更好,但给我同样的:“raise child_exception OSError: [Errno 2] No such file or directory”
  • 奇怪,当我遇到语法错误时,我往往会明白这一点。试试print(['egrep --on.... | cut -d ":" -f1']),看看手动运行该命令会得到什么。通常这是'转义或类似的语法错误。
  • 我已经用我的解决方案完成了,打印的输出可以手动使用,它与您的解决方案相同:-/它给了我:egrep --only-match '111 ' /home/gwvm/Openvas/var/lib/openvas/plugins/*.nasl
  • 奇怪的是,当我的命令只是 ='egrep --only-matching' 时,它给了我同样的错误'没有这样的......' 为什么不使用 egrep 来表示目标?
  • @G.M 您是否尝试过在我的解决方案中不使用 `*.nasl*?可能是它?
猜你喜欢
  • 1970-01-01
  • 2014-01-14
  • 2020-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多