如果我的术语已关闭,请原谅我,但我正在寻找一种方法将subparser添加到可选的argparse参数中,每个args上都有store_true
个标志。
理想情况下,我想使用以下语法在--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')
有什么建议吗?
答案 0 :(得分: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")
答案 1 :(得分: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
可选(标志)与subparser名称有什么关系吗?它的目的是什么?你是否将旗帜与subparser混淆了?
subparser也是一个位置。同时使用nargs='+'
和subparser的位置可能会有效,但可能会引起混淆。 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
。但你没有给它一个subparser命令。 --html
是未知的。
(venv)[nott@admin gumdrop]$ python gumdrop.py --shodan --html google.ca askjeeves.ca
...
现在设置shodan=True
(主解析器标志)。 --html
再次未知。它设置target=['google.ca']
。但现在它试图将askjeeves.ca
解释为subparser命令。但它与可用的选择不匹配。
我认为这些行可行:
python gumdrop.py google.ca askjeeves.ca shodan --html
python gumdrop.py --shodan google.ca shodan --html
我建议放弃整个subparser位。对于您和您的用户来说,这只是令人困惑的事情。继续在主解析器中包含--html
。它是可选的,因此可以随意使用或忽略它。你必须使用subparsers,查看文档,并尝试一些更简单的例子。
至于获取args.shodan.html
,这是一个更高级的问题,涉及命名空间的嵌套。现在开心,如果你得到args.html
。