Python安全攻防——命令行参数的了解与利用

🚀write in front🚀
🔎大家好,我是翻斗花园牛爷爷★。希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎
🆔本文由 翻斗花园牛爷爷★ 原创 CSDN首发🐒 如需转载还请通知⚠
📝个人主页:翻斗花园牛爷爷★—CSDN博客
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​
📣系列专栏:翻斗花园牛爷爷★的系列专栏——CSDN博客
✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本

目录

1.sys

2.getopt

 3.optparse

4.argparse


 

一般服务器都是linux操作系统并且是无图形界面的,所以进行任何操作都是通过命令行。一些命令行工具的使用能够大大简化代码脚本的维护成本,提升复用性,今天主要是借助于python提供的几种主流的参数解析工具来实现简单的功能。

本次,主要讲解四种命令行的处理方式:

1.sys
2.getopt
3.optparse
4.argparse

1.sys

首先,我们来了解一下sys模块;sys模块主要用于获取和Python解释器相关的信息。

我们可以先用dir()来获取对象的所有属性和方法的列表。

import sys  #导入模块
print(dir(sys))

让我们来看看结果:

7d3ebf8bd9e842649112df6a1a162fe4.png

 是不是相当多,这些就是我们获得的sys的所有属性和方法的列表。

0110bdb419c7430387459d91b84cfcff.png

简单的了解了sys后,要开始讲一下sys.argv;它的第一个方法。

sys.argv: 以列表的方式获取运行 Python 程序的命令行参数。它的第一个参数是程序本身。所以这里另定第一个参数。用代码演示一下:

import sys
def start(argv):
    print('程序名:',argv[0])
    print('第一个参数:',argv[1])
    print('第二个参数:',argv[2])
    print('第三个参数:',argv[3])
if __name__=='__main__':
    try:
        start(sys.argv[0:]) #遍历从argv[0]开始到结束。
    except KeyboardInterrupt:
        print("非法错误")


 用终端演示一下:

8c3e34da738d4913957fd2c98c08b7f8.png

 好的,简单的讲解sys后,要开始下一个模块了。🤙🤙🤙


2.getopt

getopt是对sys.argv获取的命令行参数进行二次处理。在运行程序时,可能需要根据不同的条件,输入不同的命令行选项来实现不同的功能,比如-u代表后面是用户,-p代表后面是密码。调用getopt.getopt()会返回两个列表,第一个列表赋值给opts,第二个列表赋值给args:

opts:是 (选项, 选项值) 的元组为一个元素的列表。如果没有选项值为空字符串;
args:存放没用选项单参数的列表。不属于格式信息的剩余的命令行参数;

可能大家并不是很理解,没关系,用代码给大家演示一遍,大家就能理解了。😁😁😁

import sys,getopt
opts,args=getopt.getopt(sys.argv[1:],"u:p:",["file="]) #这里从1开始是为了过滤程序本身
print("opts输出结果为:",opts)
print("args输出结果为:",args)

 在终端执行一下

1e649285ed9f4246adfd87d8d1ae5fe7.png

 51c19fea62884000be19b391ed8205b1.png

对比这两个结果,大家发现了什么 ;在这里,‘-u’和‘root’作为选项和选项值,就是属于格式信息。而本来’-p‘和’666666‘也是作为格式信息的,但是被sdwadad这串字符串改变了。所以就作为存放没用选项单参数的列表。由args进行输出了。

用代码演示一下:

import sys, getopt

def banner():
    print('\033[1;34m########################################################################################\033[0m\n'
          '\033[1;34m######################################\033[1;32m实验室\033[1;34m#####################################\033[0m\n'
          '\033[1;34m########################################################################################\033[0m\n')

def usage():
    print('-h: --help 帮助;')
    print('-u: --url  域名;')
    print('eg: python -u "www.baidu.com" ')

def start(argv):
    url = ""
    file = "" #待输入
    if len(argv) < 1: #输入的命令行长度小于1就会执行-h
        print("-h 帮助信息;\n")
        sys.exit()
    try:
        banner()
        opts, args = getopt.getopt(argv, "-u:-h",["help","file="])#‘h’后面没有 “:” 表示h这个选项没有选项值,“u:” 后面有 “:” 必须有选项值。

    except getopt.GetoptError:
        print('Error')
        sys.exit()
    for opt, arg in opts:
        if opt == "-u":
            url = arg  
        elif opt == "--file":
            file = arg
        elif (opt == "-h") or (opt == "--help"):
            usage()
    if (len(url)>0) or (len(file)>0):
        print(url,file)

if __name__ == '__main__':
    try:
        start(sys.argv[1:])
    except KeyboardInterrupt:
        print("非法输入")

注意:1.使用 sys.argv[1:] 是为过滤第一个参数(第一个参数为Python程序本身)
2.“u:h” 为定义短格式选项(-)。这里的h和u为两个选项。“h” 后面没有 “:” 表示h这个选项没有选项值,“u:” 后面有 “:” 必须有选项值。
3.[“help”, “file=”] 为定义长格式选项(--)。这里的 “=” 和上面的短格式选项中的 “:” 一样,后面必须有选项值。

因此在终端使用命令时要看请是否有:,以此来判断是否需要输入选项值。067a98e40f044328a1403ef68656e0b0.png

 如果输入的不符合格式;就会返回ERROR

13e3f56fffdc47928d460e22182ee6df.png


3.optparse

optparse模块主要用来为脚本传递命令参数,采用预先定义好的选项来解析命令行参数,与getopt函数不同的是optparse可以自动生成帮助信息。

用代码帮助大家理解一下:

import optparse

def banner():
    print('\033[1;34m########################################################################################\033[0m\n'
          '\033[1;34m######################################\033[1;32m实验室\033[1;34m#####################################\033[0m\n'
          '\033[1;34m########################################################################################\033[0m\n')

def start():
    banner()
    usage = "python %prog -u/--user <target user> -p/--password <target password>"
    parser = optparse.OptionParser(usage)
    parser.add_option('-u', '--user', dest='User', type='string', help='target user', default='root')
    parser.add_option('-p', '--password', dest='Pwd', type='string', help='target password')
    options, args = parser.parse_args()

    print("用户名为", options.User)
    print("密码为", options.Pwd)

if __name__ == '__main__':
    try:
        start()
    except KeyboardInterrupt:
        print("error")

大家可能会有疑惑,发现了很多不了解的函数。没关系,慢慢来;👍👍👍

首先是optparse.OptionParser(usage).add_option()参数:

  • 可以设置多个选项字符串,比如上面的 ‘-u’, ‘--user’ 这两个,用的时候任选其一;
  • dest=用于定义选项值存放的位置,作为后面的第一个字典(options)的键,值为命令输入的参数;
  • type用于检测命令行输入参数的数据类型是否符合要求,有 string、int、float等类型;
  • help用于定义帮助信息;
  • default设置默认值;

而%prog在这里代表的是argv[0],也就是程序本身

使用add_option()方法向parser对象中添加选项,包括"-u/--user"选项和"-p/--password"选项。其中,-u和-p是短选项,--user和--password是长选项;

调用parse_args()方法来解析命令行参数,并将解析结果赋值给options和args两个变量。options是一个Namespace对象,包含了命令行参数的值,可以通过.options来访问它们。

1;34m是ANSI转义序列的一部分,用于控制终端输出的颜色。具体来说,1代表加粗文本,34代表蓝色文本。其他的具体不再讲,感兴趣的小伙伴们可以自行百度。3dedff284ba14bcd9b1ed2341fbeef66.png

我们可以看到-h自动生成帮助信息。

921e238f979e4cf993c4e1b1ccba3f49.png


4.argparse

argparse是optparse模块的升级版,与optparse相比,argparse模块使用更加简单便捷。

我整理了一下它们的区别:

1.argparse是Python标准库中较新的命令行参数解析模块,而optparse是旧版本Python中的命令行参数解析模块。

2.支持的Python版本:argparse从Python2.7开始引入,而optparse在Python2.3被引入,不过在Python3中已经不推荐使用。

3.参数类型:argparse支持的参数类型更多,包括字符串、整数、浮点数、布尔值等,而optparse只支持字符串和整数。

4.参数默认值:argparse中可以指定参数的默认值,而optparse不支持参数的默认值。

5.子命令支持:argparse支持解析带有子命令的命令行参数,而optparse不支持。等等。

这并不是全部,这里我只简要说了几个,感兴趣的小伙伴可以自行百度一下。😬😬😬

下面用代码进行演示一遍:

import argparse

def banner():
    print('\033[1;34m########################################################################################\033[0m\n'
          '\033[1;34m######################################\033[1;32m实验室\033[1;34m#####################################\033[0m\n'
          '\033[1;34m########################################################################################\033[0m\n')

def start():
    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__':
    try:
        start()
    except KeyboardInterrupt:
        print("非法输入")

argparse.ArgumentParser().add_argument 参数设定与上面的optparse一样。这里就不再水文字里😈😈😈

先看一下它的帮助信息-h

104a8daa1107433abb507e3cb628596c.png

 再按格式执行命令:

c04f095b069c4a1e8058ab3fa8eb8851.png

本次为大家讲解了一些基于python的命令行参数,希望大家能够从中收获到东西。

创作不易,希望大佬们以及未来的大佬们给个三连再走吧

 创作不易,希望大佬们以及未来的大佬们给个三连再走吧

 创作不易,希望大佬们以及未来的大佬们给个三连再走吧

同时,也希望各位大佬能够指正文章的错误,(^_^)∠※

当然也要提醒各位小伙伴们,只有自己打出来,才能真正的掌握哦。😁😁😁

1d3aa17fcf8649c8aa9af73bae813c95.jpeg

 

 

  • 21
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

翻斗花园牛爷爷★

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值