0x00-前言
一般来说得话,大部分服务器都是linux操作系统的,且无图形画界面,所以任何操作都是基于命令就来完成,一些命令行工具的使用能够大大简化代码的维护成本,提升复用性,所以准备基于python完成命令参数的执行,丰富后续开发的批量工具
0x01-sys函数库实现命令行参数
sys
模块主要用于获取和python
解释器相关的信息,可以在python交互式解释中导入sys
库,并使用dir(sys)
查询模块内定义的所有名称,以字符串列表的形式返回:
别看很多,其实我们实际运用下有很多函数我们是用不上的,下面强调sys.argv
函数sys.argv:
以列标的方式获取python程序的命令行参数,例如sys.argv[0]
:表示该程序本身文件名,[1]
表示第一个参数,[2]
表示第二个参数,以此类推
先编写一段示例代码看看:
import sys
def main(argv):
print('程序名=',argv[0])
print('第一个参数名=',argv[1])
print('第二个参数名=',argv[2])
if __name__ == '__main__':
try:
main(sys.argv[0:])
except KeyboardInterrupt:
print("error")
sys.argv[0:]
表示持续接收后面所有参数
我们输入的参数以及文件命都如是返回,当然这只是个输出,后续我们开发工具的时候,就可以获取对应的参数 ,从而调用某些具体功能
0x02-getopt命令行参数
getopt
是对sys.argv
获取的命令行参数的二次处理。在运行程序的时候,会需要根据不同的条件,输入不同的数据参数来实现具体的功能,就和我上一章说的一样,例如:
输入-u
后的参数代表用户名,-p
后面的代表的是密码,这时候调用getopt.getopt()
就会返回俩个列表,第一个列标赋值给opts
,第二个给args
opts
:返回(选项,选择值)作为元组的一个列标,如果没有选项值,就为空字符串args
:没用的选项单参数的列表,就是没有选项的一个值:
import sys,getopt
if __name__ == '__main__':
opts,args = getopt.getopt(sys.argv[1:],"u:p:",["file="])
print(opts)
print(args)
sys.agr[1:]
表示从第一个参数开始接收,而不是程序名,后面u:p:
代表俩个参数的名字加上冒号说明必须跟上参数,且是短参数,只要-
,而后面列表中["file="]
表示长参数,需要--
如果后面跟上的参数不是-r -p
而且其他参数就会报错,如果将结果只复制给一次变量打印的话,参数和无用的选项参数就会聚在一起
对于getopt
来做一个实际运用:
import sys,getopt
def banner():
print("-"*33)
print("-"*12+'Ustinain'+'-'*12)
print("-"*33)
def tips():
print("-h : 帮助信息")
print("-v : 显示当前版本号")
print("-u : 显示当前用户名")
def main():
user=''
version=''
if len(sys.argv[1:])<1:
print("-h : 帮助信息")
exit()
try:
banner()
opts,args = getopt.getopt(sys.argv[1:],"u:v:h ",["help","file="])
except KeyboardInterrupt:
print("error")
exit()
for opt,arg in opts:
if (opt== "-u"):
user=arg
if(opt=="-v"):
version=arg
if(opt=="-h"):
tips()
if(len(user)>0 and len(version)>0):
print(user,version)
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
print("error")
下面编写了使用getpot
的一个雏形:
import sys,getopt
def banner():
print("-"*33)
print("-"*12+'Ustinain'+'-'*12)
print("-"*33)
def tips():
print("-h : 帮助信息")
print("-v : 显示当前版本号")
print("-u : 显示当前用户名")
def main():
user=''
version=''
if len(sys.argv[1:])<1:
print("-h : 帮助信息")
exit()
try:
banner()
opts,args = getopt.getopt(sys.argv[1:],"u:v:h ",["help","file="])
except KeyboardInterrupt:
print("error")
exit()
for opt,arg in opts:
if (opt== "-u"):
user=arg
if(opt=="-v"):
version=arg
if(opt=="-h"):
tips()
if(len(user)>0 or len(version)>0):
print(user,version)
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
print("error")
0x03-optparse以及argparse命令行参数
optparse:
optparse
模块主要用来为脚本传递命令参数,采用预先定义好的选项来解析命令行参数optarse.OptionParser(userge).add_option():
的参数
1.可以设置多个选项字符串,比如’-u’,’—user’用的是选一个,表达的一样同等
2.dest=
用于定义选项值存放的位置,作为后面的第一个字典options
的键,值为输入命令的参数
3.tpye
用于检测命令行输入的参数类型是否符合规范
4.help
用于定义帮助信息
5.default
设置默认值
import optparse
def banner():
print("-"*33)
print("-"*12+'Ustinain'+'-'*12)
print("-"*33)
def main():
banner()
usage ='python %prog -u/--user <traget user> -p/--password <target password> --help'
parser = optparse.OptionParser(usage)
parser.add_option('-u','--user',dest='user',type=str,help='target user',default='admin')
parser.add_option('-p','--password',dest='pwd',type=str,help='target password')
option,args =parser.parse_args()
print("[+]用户名=",option.user)
print("[+]密码=",option.pwd)
if __name__ == '__main__':
main()
相比于getopt
来说,optparse
更加简洁命令,且具备了自带help
提示,个人感觉友好太多了,但是下面这个横空出世的或许极有可能取代optparse
argparse:
没错,它就是argparse
,是optparse
模块的升级版,相比之下更为简洁明了argparse.ArgumentParser().add_argument:
参数
1.可以设置多个选项字符串,比如’-u’,’—user’用的是选一个,表达的一样同等
2.dest=
用于定义选项值存放的位置,作为后面的第一个字典options
的键,值为输入命令的参数
3.tpye
用于检测命令行输入的参数类型是否符合规范
4.help
用于定义帮助信息
5.default
设置默认值
参数方面还是和optparse差不多
import argparse
def banner():
print("-"*33)
print("-"*12+'Ustinain'+'-'*12)
print("-"*33)
def main():
banner()
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__':
main()
目前来说python的四种命令行参数的接收以及使用都已经详细的写出来了,虽然只是雏形,但是后续对于脚本亦或者工具的开发的时候,必然是会用到的,同时也期待后续工具的新面貌