您的位置:首页 > 编程语言 > Python开发

python学习系列(四)--- 获得输入参数

2015-05-06 11:04 148 查看
1.getopt最简单粗暴直接有效的方法



#!/usr/bin/python
import  sys
print   sys.argv[0]             #program   name
print   sys.argv[1]             #first  argv


sys.argv 记录命令行参数,但没有sys.argc,可以通过len(sys.argv)获取参数个数;

sys.argv[0] 是命令名;

sys.argv[1:] 是所有参数;

这种方法在面临复杂的情况显得力不从心,比如在有多个可选参数的时候。



2.optparse,它功能强大,而且易于使用,可以方便地生成标准的、符合Unix/Posix 规范的命令行说明

例如 sqlmap.py -u “xxxx” --dbs “xxx” 类似的情况,我是在分析sqlmap源码的时候,才发现这种方法的。



cmdLineOptions.update(cmdLineParser().__dict__)
        //cmdLineParser().__dict__ 返回实例的属性
        initOptions(cmdLineOptions)


以下是cmdLineParser函数的一部分代码,帮助我们理解工作原理。

def cmdLineParser():
    """
    This function parses the command line parameters and arguments
    """
 
checkSystemEncoding()
 
 _=getUnicode(os.path.basename(sys.argv[0]),encoding=sys.getfilesystemencoding())
 
    usage = "%s%s [options]" % ("python " if not IS_WIN else "", \
            "\"%s\"" % _ if " " in _ else _)
 
    parser = OptionParser(usage=usage)
 
    try:
 
        parser.add_option("--version", dest="showVersion",
                          action="store_true",
                          help="Show program's version number and exit")
 
        # Target options
        target = OptionGroup(parser, "Target", "At least one of these "
                             "options has to be provided to define the target(s)")
 
        target.add_option("-d", dest="direct", help="Connection string "
                          "for direct database connection")
 
        target.add_option("-u", "--url", dest="url", help="Target URL (e.g. \"http://www.site.com/vuln.php?id=1\")")




该函数如果执行成功返回的是 args



当执行命令sqlmap.py -u http://www.tl701.com/TeachView.asp?id=125时


这是打印出的cmdLineOptions和cmdLineParser().__dict__的内容。

cmdLineParser().__dict__ 返回实例的属性,这些属性都是在上文的代码中添加



{'code': None, 'getUsers': None, 'getPasswordHashes': None, 'excludeSysDbs': None, 'uChar': None, 'skip': None, 'db': None, 'cpuThrottle': None, 'prefix': None, 'osShell'

: None, 'googlePage': None, 'query': None, 'getComments': None, 'randomAgent': None, 'delay': None, 'authType': None, 'isDba': None, 'requestFile': None, 'predictOutput':

None, 'wizard': None, 'stopFail': None, 'forms': None, 'pivotColumn': None, 'dropSetCookie': None, 'dbmsCred': None, 'risk': None, 'sqlFile': None, 'rParam': None, 'getC

urrentUser': None, 'notString': None, 'getRoles': None, 'getPrivileges': None, 'testParameter': None, 'tbl': None, 'trafficFile': None, 'osSmb': None, 'level': None, 'sec

ondOrder': None, 'method': None, 'timeout': None, 'firstChar': None, 'torPort': None, 'wFile': None, 'binaryFields': None, 'checkTor': None, 'commonTables': None, 'direct

': None, 'saFreq': None, 'tmpPath': None, 'titles': None, 'getSchema': None, 'timeSec': None, 'paramDel': None, 'regKey': None, 'getColumns': None, 'headers': None, 'craw

lExclude': None, 'authCred': None, 'loadCookies': None, 'dnsName': None, 'showVersion': None, 'outputDir': None, 'osBof': None, 'invalidLogical': None, 'getCurrentDb': No

ne, 'hexConvert': None, 'proxyFile': None, 'answers': None, 'host': None, 'dependencies': None, 'cookie': None, 'rFile': None, 'regexp': None, 'optimize': None, 'limitSto

p': None, 'search': None, 'uFrom': None, 'noCast': None, 'testFilter': None, 'eta': None, 'csrfToken': None, 'threads': None, 'logFile': None, 'os': None, 'col': None, 'p

roxy': None, 'proxyCred': None, 'verbose': None, 'crawlDepth': None, 'updateAll': None, 'privEsc': None, 'forceDns': None, 'getAll': None, 'hpp': None, 'url': u'http://www.tl701.com/TeachView.asp?id=125', 'invalidBignum': None, 'regType': None, 'getDbs': None, 'freshQueries': None, 'uCols': None, 'smokeTest': None, 'regData': None, 'udfIn

ject': None, 'invalidString': None, 'tor': None, 'forceSSL': None, 'ignore401': None, 'beep': None, 'noEscape': None, 'configFile': None, 'scope': None, 'dumpAll': None,

'torType': None, 'regVal': None, 'ignoreProxy': None, 'mnemonics': None, 'skipUrlEncode': None, 'referer': None, 'agent': None, 'purgeOutput': None, 'retries': None, 'aut

hPrivate': None, 'extensiveFp': None, 'dumpTable': None, 'advancedHelp': None, 'batch': None, 'limitStart': None, 'flushSession': None, 'osCmd': None, 'suffix': None, 'sm

art': None, 'regDel': None, 'shLib': None, 'sitemapUrl': None, 'identifyWaf': None, 'msfPath': None, 'getHostname': None, 'sessionFile': None, 'saveCmdline': None, 'getTa

bles': None, 'liveTest': None, 'lastChar': None, 'string': None, 'dbms': None, 'dumpWhere': None, 'tamper': None, 'charset': None, 'runCase': None, 'sqlShell': None, 'osP

wn': None, 'evalCode': None, 'cleanup': None, 'csrfUrl': None, 'getBanner': None, 'profile': None, 'regRead': None, 'bulkFile': None, 'safUrl': None, 'csvDel': None, 'exc

ludeCol': None, 'dumpFormat': None, 'alert': None, 'nullConnection': None, 'user': None, 'parseErrors': None, 'getCount': None, 'dFile': None, 'data': None, 'regAdd': Non

e, 'dummy': None, 'sqlmapShell': None, 'mobile': None, 'googleDork': None, 'pickledOptions': None, 'disableColoring': None, 'pageRank': None, 'tech': None, 'textOnly': No

ne, 'cookieDel': None, 'commonColumns': None, 'keepAlive': None}



可以看到只有url这样一个属性中有内容,其他的属性全部为none。



这里牵涉到了python的optionParser模块的用法

使用流程

1.必须 import OptionParser 类,创建一个 OptionParser 对象:

from optparse import OptionParser  
[...] 
parser = OptionParser()


2.使用add_option来定义参数

parser.add_option(opt_str, ..., attr=value, ...)

每个命令行参数就是由参数名字符串和参数属性组成的。如 -f 或者 –file 分别是长短参数名:

parser.add_option("-f", "--file", ...)

3.一旦你已经定义好了所有的命令行参数,调用 parse_args() 来解析程序的命令行:

(options, args) = parser.parse_args()

注: 你也可以传递一个命令行参数列表到 parse_args();否则,默认使用 sys.argv[:1]。

parse_args() 返回的两个值:

① options,它是一个对象(optpars.Values),保存有命令行参数值。只要知道命令行参数名,如 file,就可以访问其对应的值: options.file 。

② args,它是一个由 positional arguments 组成的列表。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: