3

特定のポート番号を含む「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

何かアイデアがあれば!

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

または、単に使用します。これは、Popen でのcheck_output() 方法です;)|

ガイドライン:

を使用するPopen場合、コマンドを文字列として指定する場合は、 を使用しますshell=True。ただしPopen、リスト['ls, '-l']を指定してから を使用する場合はshell=False、そのように機能します。

データをパイプする場合、2 つの異なる を実行Popenし、最初のコマンドからの出力を 2 番目のコマンドの stdin として使用します。これは|、Linux で行うのと同じです。

于 2013-05-06T12:19:24.223 に答える