0

如果我的术语不正确,请原谅我,但我正在寻找一种将子解析器添加到可选 argparse 参数的方法,store_true每个 args 上都有标志。

理想情况下,我想使用以下语法来引用子解析器--html中的布尔值shodan_parser

if args.shodan.html:
    print("Doing a thing") 

parser = argparse.ArgumentParser()
parser.add_argument("-r", "--reverse-dns", help="rDNS on host", action="store_true")
parser.add_argument("-s", "--shodan", help="perform SHODAN query on discovered IPs", action="store_true")
parser.add_argument("targets", help="IPv4 addresses to search for", nargs="+")

subparsers = parser.add_subparsers()
shodan_parser = subparsers.add_parser("shodan", help="SHODAN options")
shodan_parser.add_argument("--html", action="store_true")
shodan_parser.set_defaults(which='shodan')

输出:

(venv)[nott@admin gumdrop]$ python gumdrop.py google.ca --shodan --html
usage: gumdrop.py [-h] [-r] [-e] [-s] targets [targets ...] {shodan} ...
gumdrop.py: error: too few arguments

(venv)[nott@admin gumdrop]$ python gumdrop.py --shodan --html google.ca askjeeves.ca
usage: gumdrop.py [-h] [-r] [-e] [-s] targets [targets ...] {shodan} ...
gumdrop.py: error: invalid choice: 'askjeeves.ca' (choose from 'shodan')

有什么建议么?

4

2 回答 2

0

您需要将开关从“-h”更改为其他内容(或禁用帮助),因为“-h”开关已被帮助菜单使用

parser = argparse.ArgumentParser()
parser.add_argument("-r", "--reverse-dns", help="rDNS on host", action="store_true")
parser.add_argument("-s", "--shodan", help="perform SHODAN query on discovered IPs", action="store_true")parser.add_argument("targets", help="IPv4 addresses to search for", nargs="+")

subparsers = parser.add_subparsers()
shodan_parser = subparsers.add_parser("shodan", help="SHODAN options")
shodan_parser.add_argument("--html", action="store_true")
shodan_parser.set_defaults(which='shodan')

args = parser.parse_args()

if args.html:
    print("Doing a thing")
于 2013-10-03T04:14:44.900 回答
0
parser = argparse.ArgumentParser()
parser.add_argument("-r", "--reverse-dns", help="rDNS on host", action="store_true")
parser.add_argument("-s", "--shodan", help="perform SHODAN query on discovered IPs", action="store_true")
parser.add_argument("targets", help="IPv4 addresses to search for", nargs="+")

这个--shodan可选(标志)与子解析器名称有什么关系吗?它的目的是什么?您是否将标志与子解析器混淆?

子解析器也是一个位置。同时使用位置nargs='+'分析器和子分析器可能会起作用,但可能会引起混淆。结束列表targets和子解析器(及其参数)何时开始?

subparsers = parser.add_subparsers()
shodan_parser = subparsers.add_parser("shodan", help="SHODAN options")
...

你的输出

(venv)[nott@admin gumdrop]$ python gumdrop.py google.ca --shodan --html
....

我猜这集targets=['google.ca'], shodan=True. 但是你还没有给它一个子解析器命令。是--html一个未知数。

(venv)[nott@admin gumdrop]$ python gumdrop.py --shodan --html google.ca askjeeves.ca
...

现在你设置shodan=True(主解析器标志)。又--html是未知数。它设置target=['google.ca']. 但现在它试图解释askjeeves.ca为子解析器命令。但它与可用的选择不匹配。

我认为这些行会起作用:

python gumdrop.py google.ca askjeeves.ca shodan --html
python gumdrop.py --shodan google.ca shodan --html

我建议放弃整个 subparser 位。对于您和您的用户来说,这只是令人困惑的事情。继续并包含--html在主解析器中。它是可选的,因此可以随意使用或忽略。您必须使用子解析器,查看文档并尝试一些更简单的示例。

至于 get args.shodan.html,这是一个更高级的问题,涉及命名空间的嵌套。现在,如果你得到args.html.

于 2013-10-03T16:44:46.577 回答