2016-11-05 38 views
4

我正在Python中编写一个侦察工具,我遇到了一些问题,试图在多行变量前面打印一个字符串而不编辑字符串本身在前面打印字符串可变行Python 2.7

这里是我的代码条子:

# ... 
query1 = commands.getoutput("ls -1 modules/recon | grep '.*\.py$' | grep -v '__init__.py'") 
print("module/%s/%s" % (module_type, query1.strip(".py")) 

我要添加的“模块/#的module_type /#MODULE_NAME”和模块名称是唯一改变的事情。因此,利用撒旦和Bing模块(随机)的输出会是这个样子:

modules/recon/shodan 
modules/recon/bing 

而是我得到

modules/recon/bing.py 
shodan 

谢谢!

回答

1

你可以做你所要求的是这样的:

from os import path 

module_type = 'recon' 
q = 'shoban.py\nbing.py' # insert the your shell invocation here 
modules = (path.splitext(m)[0] for m in q.split('\n')) 
formatted = ('modules/%s/%s' % (module_type, m) for m in modules) 
print('\n'.join(formatted)) 

输出:

modules/recon/shodan 
modules/recon/bing 

但既然你已经用Python调用一个UNIX shell,你还不如用sed为字符串处理:

print(commands.getoutput("ls modules/recon/ | sed '/.py$/!d; /^__init__.py$/d; s/\.py$//; s/^/modules\/recon\//'")) 

您还可以使用shell的“globbing”功能来使命令更加简单,如果,你正在寻找的模块(如模块/侦察)的位置,你需要输出前缀匹配:

print(commands.getoutput("ls modules/recon/*.py | sed 's/.py$//; /\/__init__$/d'")) 

另一种选择是只使用Python的标准库:

from os import path 
import glob 

module_type = 'recon' 
module_paths = glob.iglob('modules/recon/*.py') 
module_files = (m for m in map(path.basename, modules) if m != '__init___.py') 
modules = (path.splitext(m)[0] for m in module_files) 
formatted = ("modules/%s/%s" % (module_type, m) for m in modules) 
print('\n'.join(formatted)) 
+2

这是挑剔的,但你可以使用'os.path.splitext'来摆脱文件扩展名而不是文字's [-3]' –

+0

@АндрейБеньковский它似乎我意外地不接受它。代码运行良好,我得到了它的工作。谢谢! – R3C0Nx00