不让古人,是谓有志。不让今人,是谓无良。
俗话说的好
前言
猪头:哥,我看 sqlmap
,nmap
等神器都是可以在命令行直接带参数,像我这种脚本小子就只会用 input
弹出一条提示信息来接收输入,好 low 啊。
匠:咳咳嗯~ 其实吧,你和大神只差一个模块的距离,学会了它,你也可以装装逼。
猪头:真的吗?!!啥模块?教我,哥,我也要像黑客一样活着。。。
匠:那就是 optparse
模块和 argparse
模块,不过,optparse模块在2.7版本后将被弃用也不会得到更新,会使用argparse模块来替代。具体实现且听我细细讲来。
optparse 模块
1 基本框架
import optparsedef main(): parser = optparse.OptionParser() parser.usage = 'python3 optparse - argparse -h host -p port' parser.add_option('-H',dest='tgthost',type='string',help='specify target host') # 注意这里使用 -H 来指明导入主机,因为 -h 是约定俗成的查看帮助作用, parser.add_option('-p',dest='tgtport',type='int',help='specify target port') (options,args) = parser.parse_args() if options.tgthost == None or options.tgtport == None: print(parser.usage) exit(0) else: tgthost = options.tgthost tgtport = options.tgtport print('主机是:' + tgthost) print('端口是:' + str(tgtport))if __name__ == '__main__': main()
~$> python3 optparse模块使用.py -H zhutou.com -p 21 22主机是:zhutou.com端口是:21
以上的程序有个缺点,就是不能接收多个参数,比如不能接收多个主机或多个端口,于是使用 append()
方法来扩容。
2append扩容之后
import optparsedef main(): parser = optparse.OptionParser() parser.usage = 'python3 optparse - argparse -h host -p port' parser.add_option('-H',dest='tgthost',type='string',help='specify target host') # 注意这里使用 -H 来指明导入主机,因为 -h 是约定俗成的查看帮助作用, parser.add_option('-p',dest='tgtport',type='int',help='specify target port') (options,args) = parser.parse_args() tgthost = options.tgthost tgtport = options.tgtport args.append(tgtport) if tgthost == None or tgtport == None: print(parser.usage) exit(0) else: print('主机是:' + tgthost) print('端口是:' ,end='') for port in args: print(str(port) + ' ',end='')if __name__ == '__main__': main()
~$> python optparse模块使用.py -H zhutou.com -p 22 21 25 443 445 3306主机是:zhutou.com端口是:21 25 443 445 3306 22
argparse 模块
argparse
模块使得创建一个用户友好的命令行接口更加容易,程序定义了它需要的参数,同时 argparse
模块将知道如何解析 sys.argv
之外的参数。argparse 模块还会自动地生成 help
和 usage
信息,并在用户输入不合理的参数之后会发出错误。
之前说过,了解一个模块最好的办法就是看官方文档,argparse
模块的官方文档链接如下:
https://docs.python.org/3/howto/argparse.html#id1
1 基本框架
import argparsedef main(): parse = argparse.ArgumentParser(description='demo of argparse') parse.add_argument('-H', '--host', dest='hostname', help='hostname is need') # 这里要注意不能是 -h ,这样就和显示帮助信息的 -h 重复了 parse.add_argument('-p', '--port', dest='ports', help='ports are need') args = parse.parse_args() if args.hostname == None or args.ports == None: print(parse.usage) exit(0) else: hostname = args.hostname ports = args.ports print('scan {} : {}'.format(hostname, ports))if __name__ == '__main__': main()
C:\Users\Lin\Desktop>python3 tmp.py -husage: tmp.py [-h] [-H HOSTNAME] [-p PORTS [PORTS ...]]demo of argparseoptional arguments: -h, --help show this help message and exit -H HOSTNAME, --host HOSTNAME hostname is need -p PORTS [PORTS ...], --port PORTS [PORTS ...] ports are needC:\Users\Lin\Desktop>python3 tmp.py -H hunter.com -p 21scan hunter.com : 21
2 default
default
表示命令行没有设置该参数的时候,程序默认使用 default
指定的值代替。
parser.add_argument('-n',default='zhutou')
3 required
如果设置了 required=True
,则在实际运行的时候不设置该参数将报错。
parser.add_argument('-n',required=True)
4 type
默认的参数类型是 str
类型,可以设置成整型/布尔型:type=int
或 type=bool
parser.add_argument('-n',type=int)parser.add_argument('-n',type=bool)
5 choices
参数值只能从几个选项里面选择。
parser.add_argument('-n',choices=['zhutou1','zhutou2','zhutou3'])
6 help
指定参数说明的信息。
7 dest
设置参数在代码中的变量名,如果通过 dest=xxx
设置了参数的变量名,那么在代码中使用 args.xxx
来获取参数值。
8 nargs
设置了参数可以接收多少个参数。
parser.add_argument('-n',nargs='')
nargs 值 | 含义 |
---|---|
N | 参数的绝对个数(例如:3) |
'?' | 0或1个参数 |
'*' | 0或所有参数 |
'+' | 所有,并且至少一个参数 |
尾声
我是匠心,一个在清流旁默默磨剑的匠人,期待那一天能利刃出鞘,仗剑走江湖。