2015-07-13 70 views
1

我想为我的python脚本运行subprocess.check_output方法。子进程python - 非零异常

try: 
     logger.info('Loading URL ' + line) 
     wp_output = subprocess.checkout(['ruby', PATH + '/wpscan.rb', '--url', line, '--enumerate', 
      'vp', '--enumerate', 'vt']) 
     print wp_output 
     logger.info(wp_output) 
     return wp_output.strip() 

    except KeyboardInterrupt: 
     raise 
    except subprocess.CalledProcessError, e: 
     logger.exception('ERROR - Problem occurred while using wpscan.') 

例外:

File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 573, in check_output 
    raise CalledProcessError(retcode, cmd, output=output) 
CalledProcessError: Command '[u'ruby', u'./wpscan/wpscan.rb', u'--url', 'www.website.de', u'--enumerate', u'vp', u'--enumerate', u'vt']' returned non-zero exit status 1 

,如果我跑check_output我得到一个非零例外,如果我只用“subprocess.call”我得到的结果是“打印wp_output”只有INT 1 ??

我做错了什么?我想获得输出为一个字符串(wp_output)。

+0

当您从终端直接运行该命令时,是否收到任何错误? –

+0

@AnandSKumar不,它工作正常 – Loretta

+0

ruby​​ wpscan.rb --url www.mywebsite.de --enumerate vp --enumerate vt - 完美的作品 – Loretta

回答

1

当您运行subprocess.call时,会返回一个表示程序退出代码的int值。通常0表示一切正常,其他数字(如1)表示错误。

subprocess.check_output将专门将错误视为python本身内的异常,并将其引发,从而产生结果。

如果您希望字符串输出无论是错误还是成功,请使用Popen

command = ['ruby', PATH + '/wpscan.rb', '--url', line, '--enumerate', 
     'vp', '--enumerate', 'vt'] 
wp_output = subprocess.Popen(command, stdout=subprocess.PIPE) 
wp_output = wp_output.communicate() 
print wp_output 

使用Popensubprocess.PIPE,然后运行communicate它会为您提供包含您的命令返回的文本元组,它是否是一个错误或没有。

+0

很酷,谢谢:)嗯,但为什么它有错误?我使用一切正确的:/ – Loretta

+0

在猜测,我认为Python运行不同的环境变量。这意味着它无法找到名称与“红宝石”。尝试使用Ruby可执行文件的确切路径作为第一个参数,并查看是否有所作为。 – SuperBiasedMan

+0

但是如果ruby无法找到,它将永远不会执行代码,但它执行了wpscan,并且在最后我得到了异常 – Loretta

0

这是SuperBiasedMan评论的插件。将stderr重定向也会很好,因为错误通常出现在标准错误中而不是标准输出。

command = ['ruby', PATH + '/wpscan.rb', '--url', line, '--enumerate', 
    'vp', '--enumerate', 'vt'] 
wp_proc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
wp_output, wp_error = wp_proc.communicate() 

if wp_error != '': 
    print wp_error 
else: 
    print wp_output