0x00-前言
一般来说得话,大部分服务器都是linux操作系统的,且无图形画界面,所以任何操作都是基于命令就来完成,一些命令行工具的使用能够大大简化代码的维护成本,提升复用性,所以准备基于python完成命令参数的执行,丰富后续开发的批量工具
0x01-sys函数库实现命令行参数
sys模块主要用于获取和python解释器相关的信息,可以在python交互式解释中导入sys库,并使用dir(sys)查询模块内定义的所有名称,以字符串列表的形式返回:
别看很多,其实我们实际运用下有很多函数我们是用不上的,下面强调sys.argv函数sys.argv:以列标的方式获取python程序的命令行参数,例如sys.argv[0]:表示该程序本身文件名,[1]表示第一个参数,[2]表示第二个参数,以此类推
先编写一段示例代码看看:
import sysdef 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,第二个给argsopts:返回(选项,选择值)作为元组的一个列标,如果没有选项值,就为空字符串args:没用的选项单参数的列表,就是没有选项的一个值:
import sys,getoptif __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,getoptdef 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=argif(opt=="-v"):version=argif(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的四种命令行参数的接收以及使用都已经详细的写出来了,虽然只是雏形,但是后续对于脚本亦或者工具的开发的时候,必然是会用到的,同时也期待后续工具的新面貌
