前言
在运行python脚本的时候需要添加许多参数,例如:dirsearch -u "xxxx.com" -e *
,那么脚本程序如何接受这些命令行传递的参数呢?
下面有四种方式,我个人觉得学习第一种和第四种即可,因为一些简单的程序可以用第一种简单一点,第四种方式是第三种方式的升级版。
0x01 sys.argv
sys.argv以列表的方式获取运行 Python 程序的命令行参数。其中 ,sys.argv[0] 通常指该 Python程序本身,sys.argv[1]代表第一个参数,sys.argv[2]代表第二个参数,以此类推。
例如下面这段代码将获取并输出传递给其的命令行参数:
import sys
def start():
print("程序本身:"+sys.argv[0])
print("第一个参数:"+sys.argv[1])
print("第二个参数:"+sys.argv[2])
print("第三个单数"+sys.argv[3])
if __name__ == '__main__':
try:
start()
except KeyboardInterrupt:
print("interrupted by user,killing all threads...")
运行结果:
0x02 getopt
getopt是对sys.argv获取的命令行参数进行二次处理。在运行程序时,可能需要根据不同的条件,输入不同的命令行选项来实现不同的功能,比如-u代表后面是用户,-p代表后面是密码。调用getopt.getopt()会返回两个列表,第一个列表赋值给opts,第二个列表赋值给args:
简单点来说,就是将选项赋值给opts,将值赋给args。比如namp -sS www.baidu.com
,中-sS会赋值给opts,www.baidu.com会赋值给args。
例如下面这段代码
import sys, getopt
opts, args = getopt.getopt(sys.argv[1:], "u:h", ["help","file="])
print("opt输出结果为:", opts)
print("argv输出结果为:", args)
- 使用 sys.argv[1:] 是为过滤第一个参数(第一个参数为Python程序本身)
- “u:h” 为定义短格式选项(-)。这里的h和u为两个选项。“h” 后面没有 “:” 表示h这个选项没有选项值,“u:” 后面有 “:” 必须有选项值。
- [“help”, “file=”] 为定义长格式选项(–)。这里的 “=” 和上面的短格式选项中的 “:” 一样,后面必须有选项值。
运行结果:
0x02 optparse
optparse模块主要用来为脚本传递命令参数,采用预先定义好的选项来解析命令行参数,与getopt函数不同的是optparse可以自动生成帮助信息。
optparse.OptionParser(usage).add_option()参数:
- 可以设置多个选项字符串,比如上面的 ‘-u’, ‘–user’ 这两个,用的时候任选其一;
- dest=用于定义选项值存放的位置,作为后面的第一个字典(options)的键,值为命令输入的参数;
- type用于检测命令行输入参数的数据类型是否符合要求,有 string、int、float等类型;
- help用于定义帮助信息;
- default设置默认值;
0x04 argparse(重点)
argparse是optparse模块的升级版,与optparse相比,argparse模块使用更加简单便捷,其使用效果如下图所示。相信未来argparse会逐渐替代optparse。
代码示例:
import argparse
def start():
parser = argparse.ArgumentParser()
parser.add_argument('-u', '--user', dest='User', type=str, default='root', help='target User')
parser.add_argument('-s', '--sex', dest='Sex', type=str, choices=['男', '女'], default='男', help='target Sex')
parser.add_argument('-n', '--number', dest='Num', nargs=2, required=True, type=int, help='target Two Numbers')
print(parser.parse_args().User,parser.parse_args().Sex,parser.parse_args().Num)
if __name__ == '__main__':
try:
start()
except KeyboardInterrupt:
print("interrupted by user, killing all threads...")
使用流程:
1. 创建一个解析对象parser
parser = argparse.ArgumentParser(description='Process some intergers.')
使用argparser的第一步是创建一个ArgumentParser对象,ArgumentParser对象包含将命令行解析成Python数据类型所需的全部信息。
- description - 在参数帮助文档之后显示的文本 (默认值:无)
2. 然后向该对象中添加你要关注的命令行参数和选项,每一个add_argument方法对应一个你要关注的参数或选项
parser.add_argument('-u', '--user', dest='User', type=str, default='root', help='target User')
-
name/flags:参数的名字
-
action:遇到参数时的动作,默认值时store(存储)。
-
default - 当参数未在命令行中出现时使用的值
-
dest:解析后的参数名称
-
type - 为参数类型,例如int
-
choices - 用来选择输入参数的范围。例如choice = [1, 5, 10], 表示输入参数只能为1,5 或10
-
help - 用来描述这个选项的作用
-
nargs:参数的个数,可以时具体的数字,或者是+号或者*号。* :0或者多个参数,+:1个或多个参数。
-
required:可选参数是否可以省略
3. 最后调用parse_args()方法进行解析;解析成功之后即可使用。
parser.parse_args().User
使用parser.parse_args()来获取参数,这里的User是前面dest定义的名字
0x05 实战
使用argparse写一个ping网址的脚本,-u接受要ping的网址
import argparse
import os
def ping():
parse = argparse.ArgumentParser()
parse.add_argument('-u', '--url', dest='url', nargs=1, type=str, required=True)
url = parse.parse_args().url
cmd = "ping "+url[0]
os.system(cmd)
if __name__ == '__main__':
try:
ping()
except BaseException as e:
print(e)