鱼C论坛

 找回密码
 立即注册
查看: 2105|回复: 0

[技术交流] Python命令行:getopt模块详解(仅做个人收藏)

[复制链接]
发表于 2020-1-20 11:38:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
官方介绍地址: https://docs.python.org/3.1/library/getopt.html
原文:https://www.jianshu.com/p/a877e5b46b2d


铺垫一下基础知识
我最早接触的脚本语言是asp,但是并没有怎么学习,不过40-50%的代码还是可以看懂的。
之前我唯一掌握的脚本语言是PHP。当时自己想写一个POC,由于不想通过浏览器的形式去访问,我直接把脚本传入脚本解释器去运行,心里很痛快!到后来发觉不怎么方便,每次使用都得去打开文件修改,然后保存,最后执行它。

让我唯一想到的是我接触C语言的时候,第一个小程序大家都知道,叫"hello world”
C语言的代码如下:

  1. #include <stdio.h>
  2. void main(int arg ,char *argv[]){
  3. printf("hello world !!")
  4. }
复制代码

当时很纳闷这个main里面的东西,就去了解了一下。

int arg 是参数的个数 arv是参数的值

到此我就明白了它是如何使用的

  1. root@Kali:~#./progrom abc bcd
复制代码

此时arg为2,arv的元素里就已经包含了[文件名,abc,bcd]

那么文件名就是arv[0]咯~
当时搞明白了以后就用C语言写了个文件管理器,但是现在忘的差不多了。
查阅资料后发现PHP脚本也一样支持,那个问题我就是通过C语言的特性去解决的。

在php中是$argc,$argv[] 这两个是预先定义好的变量
真的发现接触了脚本语言让人懒惰了不少呢,但是也省去了很多造轮子的时间,是人们更加容易学习它。

进阶
好啦,我先简单概述一下python的getopt模块。
如果不想听我叨叨,那就告诉你个小例子:
print(getopt.__doc__)

参数
这个模块一共有两个函数,两个属性
函数:

getopt.getopt
getopt.gnu_getopt
属性:

getopt.error
getopt.GetoptError
这两个属性主要是用来抛出错误信息的,非常友好不是吗?
我们主要经常使用getopt这个函数,那下面我们先瞧瞧这个家伙有哪些参数吧!

getopt.getopt(args, shortopts, longopts=[])
args指的是当前脚本接收的参数,它是一个列表,可以通过sys.argv获得
shortopts 是短参数  啥是短参数啊?  类似于 这样:python test.py -h # 输出帮助信息
longopts 是长参数  啥是长参数啊?  类似于 这样:python test.py -help # 输出帮助信息

可能你已经明白一点了,但是重要的还在后面,那就是此函数的返回值

返回值
这个函数返回是一个两元组的列表(复习一下,元组的值是不可修改的!)
下面我写一个小例子,让你稍微顿悟一下

  1. import getopt
  2. import sys

  3. arg = getopt.getopt(sys.argv[1:],'-h',['help'])
  4. print(arg)
  5. 结果如下:

  6. root@Kali:~/python# python3.5 test.py -h
  7. ([('-h', '')], [])
  8. root@Kali:~/python# python3.5 test.py --help
  9. ([('--help', '')], [])
  10. root@Kali:~/python#
复制代码

可以看到已经接收了参数。并且做了处理,为啥我传入sys.argv[1:]?

因为sys.argv里的argv[0]是当前脚本的文件名,不需要它去参与,要不然你的选项和选项值无法匹配,问题多多。
假设我要接收一个参数+参数值的选项怎么办?

再写个小例子!

  1. #!/usr/bin/env python3.5
  2. import urllib.request
  3. import getopt
  4. import sys

  5. opts,args = getopt.getopt(sys.argv[1:],'-h-f:-v',['help','filename=','version'])
  6. for opt_name,opt_value in opts:
  7.     if opt_name in ('-h','--help'):
  8.         print("[*] Help info")
  9.         exit()
  10.     if opt_name in ('-v','--version'):
  11.         print("[*] Version is 0.01 ")
  12.         exit()
  13.     if opt_name in ('-f','--filename'):
  14.         fileName = opt_value
  15.         print("[*] Filename is ",fileName)
  16.         # do something
  17.         exit()
复制代码

运行测试结果如下:

  1. root@Kali:~/python# python3.5 test.py --filename=test
  2. [*] Filename is  test
  3. root@Kali:~/python# python3.5 test.py --filename=
  4. [*] Filename is  
  5. root@Kali:~/python# python3.5 test.py --help
  6. [*] Help info
  7. root@Kali:~/python# python3.5 test.py --version
  8. [*] Version is 0.01
  9. root@Kali:~/python# python3.5 test.py -v
  10. [*] Version is 0.01
  11. root@Kali:~/python# python3.5 test.py -f test
  12. [*] Filename is  test
  13. root@Kali:~/python#
复制代码

来详细解释一下这几行代码
首先从短参数名开始。
我定义了'-h-f:-v' 大家发现没有,在-f后面多了一个":"
这个":"代表了当前参数是有值的,是一个参数名+参数值的参数
如果我再加一个-o: 那么证明-o后面是可以接收一个值,这个值就是-o的参数值,将会保存到opts变量中。
长参数名的方式和短参数差不多,唯一的区别就是长参数如果要接收值,那必须得在后面加上一个"="

运行结果
调用问题
短参数使用的时候是参数名[空格]参数值
长参数使用的时候是参数名=参数值
PS:不理解可以看我的测试结果

opts和args
opts 为分析出的格式信息。args 为不属于格式信息的剩余的命令行参数。
opts 是一个两元组的列表。每个元素为:( 选项串, 附加参数) 。如果没有附加参数则为空串'' 。
总结
到此你就可以总结sqlmap是如何接收那么多的参数啦~
附上一张运行图

总之这个多写几个例子就可以了,我之前的项目就是采用了这个模块。
你可以去看看:http://www.jianshu.com/p/2163b305b7f8

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-10 09:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表