Python Argparse模块学习 2016-03-28

最近是打算写个好用的webdirscan,毕竟现成的没找到几个好用的

所以发挥麒麟臂,自己写一套适合自己以及自己喜欢的web目录扫描工具,

也就当是巩固Python基础的一个过程。

前言

首先考虑到要做webdirscan就必须传入主机、字典、脚本语言等,所以就涉及到了命令行传入参数的问题,于是看了看其他的脚本都是如何接收参数,调用参数,我这里看的是lijiejie的子域名爆破工具,里面import了argparse模块,所以就去官方找了文档,这里对文档进行简单的翻译和理解。

没有接收参数(–help除外)

#!/usr/bin/env python
# coding:utf-8

import argparse

parse = argparse.ArgumentParser()
args = parse.parse_args()

接收必须参数

简单接收一个参数

举个栗子,接收一个host参数并输出:

#!/usr/bin/env python
# coding:utf-8

import argparse

parse = argparse.ArgumentParser()
parse.add_argument('host')
args = parse.parse_args()

print args.host

结果如下:

striker@Striker-Ubuntu:~/Desktop/PythonStudy$ ./argparseStudy.py www.hackersb.cn
www.hackersb.cn

如果没有带参数,则返回:

striker@Striker-Ubuntu:~/Desktop/PythonStudy$ ./argparseStudy.py 
usage: argparseStudy.py [-h] host
argparseStudy.py: error: too few arguments

给接收的参数添加帮助文字

举个例子,给上文的host添加帮助文字:

#!/usr/bin/env python
# coding:utf-8

import argparse

parse = argparse.ArgumentParser()
parse.add_argument('host',help="This is host for scan.")
args = parse.parse_args()

print args.host

这个时候执行argparseStudy.py -h会返回:

striker@Striker-Ubuntu:~/Desktop/PythonStudy$ ./argparseStudy.py -h
usage: argparseStudy.py [-h] host

positional arguments:
  host        This is host for scan.

optional arguments:
  -h, --help  show this help message and exit

设置接收参数的类型

这里以int型为例,当然也有string类型,这里还支持什么类型,我不知道.. 反正常用的就int和string吧…

#!/usr/bin/env python
# coding:utf-8

import argparse

parse = argparse.ArgumentParser()
parse.add_argument('host',help="This is host for scan.",type=int)
args = parse.parse_args()

print args.host

以下是我输入string类型和int类型的返回结果:

striker@Striker-Ubuntu:~/Desktop/PythonStudy$ ./argparseStudy.py aaa
usage: argparseStudy.py [-h] host
argparseStudy.py: error: argument host: invalid int value: 'aaa'
striker@Striker-Ubuntu:~/Desktop/PythonStudy$ ./argparseStudy.py 123
123

输入aaa的时候因为不是int型,所以报错~

接收可选参数

接收需要传值的可选参数

比如做webdirscan需要输入文件后缀,如:php、jsp、aspx、asp,但这个参数是可选的:

#!/usr/bin/env python
# coding:utf-8

import argparse

parse = argparse.ArgumentParser()
parse.add_argument('--suffix',help="This is suffix on scan file")
args = parse.parse_args()

if args.suffix:
    print args.suffix

以下是我可选参数的传入方式、并且不传该参数也不会报错~ 毕竟是可选参数:

striker@Striker-Ubuntu:~/Desktop/PythonStudy$ ./argparseStudy.py --suffix php
php
striker@Striker-Ubuntu:~/Desktop/PythonStudy$ ./argparseStudy.py

接收无需传值的可选参数

比如我们做webdirscan的时候,如果传入--thread就启用多线程,不传入则单线程:

#!/usr/bin/env python
# coding:utf-8

import argparse

parse = argparse.ArgumentParser()
parse.add_argument('--thread',help="open the more thread",action="store_true")
args = parse.parse_args()


if args.thread:
print ‘more thread!’

返回结果如下,如果我带上--thread则输出多线程:

striker@Striker-Ubuntu:~/Desktop/PythonStudy$ ./argparseStudy.py
striker@Striker-Ubuntu:~/Desktop/PythonStudy$ ./argparseStudy.py --thread
more thread!

短配置

缩短我们的参数,很多程序中都用单个字母代替,比如nmap的-port简写为-p,我们也可以这样:

#!/usr/bin/env python
# coding:utf-8

import argparse

parse = argparse.ArgumentParser()
parse.add_argument('-t','--thread',help="open the more thread",action="store_true")
args = parse.parse_args()


if args.thread:
print ‘more thread!’

运行结果如下:

striker@Striker-Ubuntu:~/Desktop/PythonStudy$ ./argparseStudy.py
striker@Striker-Ubuntu:~/Desktop/PythonStudy$ ./argparseStudy.py -t
more thread!

大概就学习到这里,基本上常用的已经介绍了,其他少用的可以去看官方文档

参考