0x00-前言

一般来说得话,大部分服务器都是linux操作系统的,且无图形画界面,所以任何操作都是基于命令就来完成,一些命令行工具的使用能够大大简化代码的维护成本,提升复用性,所以准备基于python完成命令参数的执行,丰富后续开发的批量工具

0x01-sys函数库实现命令行参数

sys模块主要用于获取和python解释器相关的信息,可以在python交互式解释中导入sys库,并使用dir(sys)查询模块内定义的所有名称,以字符串列表的形式返回:
image.png
别看很多,其实我们实际运用下有很多函数我们是用不上的,下面强调sys.argv函数
sys.argv:以列标的方式获取python程序的命令行参数,例如
sys.argv[0]:表示该程序本身文件名,[1]表示第一个参数,[2]表示第二个参数,以此类推
先编写一段示例代码看看:

  1. import sys
  2. def main(argv):
  3. print('程序名=',argv[0])
  4. print('第一个参数名=',argv[1])
  5. print('第二个参数名=',argv[2])
  6. if __name__ == '__main__':
  7. try:
  8. main(sys.argv[0:])
  9. except KeyboardInterrupt:
  10. print("error")

sys.argv[0:]表示持续接收后面所有参数
image.png
我们输入的参数以及文件命都如是返回,当然这只是个输出,后续我们开发工具的时候,就可以获取对应的参数 ,从而调用某些具体功能

0x02-getopt命令行参数

getopt是对sys.argv获取的命令行参数的二次处理。在运行程序的时候,会需要根据不同的条件,输入不同的数据参数来实现具体的功能,就和我上一章说的一样,例如:
输入-u后的参数代表用户名,-p后面的代表的是密码,这时候调用getopt.getopt()就会返回俩个列表,第一个列标赋值给opts,第二个给args
opts:返回(选项,选择值)作为元组的一个列标,如果没有选项值,就为空字符串
args:没用的选项单参数的列表,就是没有选项的一个值:

  1. import sys,getopt
  2. if __name__ == '__main__':
  3. opts,args = getopt.getopt(sys.argv[1:],"u:p:",["file="])
  4. print(opts)
  5. print(args)

sys.agr[1:]表示从第一个参数开始接收,而不是程序名,后面u:p:代表俩个参数的名字加上冒号说明必须跟上参数,且是短参数,只要-,而后面列表中["file="]表示长参数,需要--
image.png
如果后面跟上的参数不是-r -p而且其他参数就会报错,如果将结果只复制给一次变量打印的话,参数和无用的选项参数就会聚在一起
image.png
对于getopt来做一个实际运用:

  1. import sys,getopt
  2. def banner():
  3. print("-"*33)
  4. print("-"*12+'Ustinain'+'-'*12)
  5. print("-"*33)
  6. def tips():
  7. print("-h : 帮助信息")
  8. print("-v : 显示当前版本号")
  9. print("-u : 显示当前用户名")
  10. def main():
  11. user=''
  12. version=''
  13. if len(sys.argv[1:])<1:
  14. print("-h : 帮助信息")
  15. exit()
  16. try:
  17. banner()
  18. opts,args = getopt.getopt(sys.argv[1:],"u:v:h ",["help","file="])
  19. except KeyboardInterrupt:
  20. print("error")
  21. exit()
  22. for opt,arg in opts:
  23. if (opt== "-u"):
  24. user=arg
  25. if(opt=="-v"):
  26. version=arg
  27. if(opt=="-h"):
  28. tips()
  29. if(len(user)>0 and len(version)>0):
  30. print(user,version)
  31. if __name__ == '__main__':
  32. try:
  33. main()
  34. except KeyboardInterrupt:
  35. print("error")

image.png
下面编写了使用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的四种命令行参数的接收以及使用都已经详细的写出来了,虽然只是雏形,但是后续对于脚本亦或者工具的开发的时候,必然是会用到的,同时也期待后续工具的新面貌