argparse and TypeError: execv() arg 2 must contain only strings
argparse and TypeError: execv() arg 2 must contain only strings
我知道这个问题已经被问了很多,但是通过拖网搜索给出的答案:
- 没有解决我的问题
- 与我所看到的完全不相关
总的来说,我对编码还比较陌生,这是我第一次尝试使用 argparse。
基本上我的脚本出现以下错误:
TypeError: execv() arg 2 must contain only strings
我正在尝试为 Spike Fuzzer 编写一个非常简单的包装器,当我将参数 -p、-v 和 -s 静态设置为整数(不使用 argparse)时,脚本运行没有问题。当我尝试为它们使用参数时,我看到了上述错误。
请看下面的代码:
import argparse, subprocess, os, sys
parser = argparse.ArgumentParser(prog='fuzz.py',
usage='%(prog)s -i 127.0.0.1 -p 21 -d /root/example -v 0 -s 0',
)
parser.add_argument('--version', action='version', version='[+] Version: BETA')
parser.add_argument('-i', metavar='127.0.0.1',
help="IP Address"
)
parser.add_argument('-p',
type=int,
default=21,
metavar='21',
nargs=1,
help="Port (Default 21)",
)
parser.add_argument('-d', metavar='/root/example',
help="Spike script directory"
)
parser.add_argument('-f', metavar='example.spk',
nargs=1,
help="Spike File"
)
parser.add_argument('-v',
type=int,
default=0,
metavar='0',
nargs=1,
help="SKIPVAR (Default 0)",
)
parser.add_argument('-s',
type=int,
default=0,
metavar='0',
nargs=1,
help="SKIPSTR (Default 0)",
)
args = parser.parse_args()
def Directory():
for file in os.listdir(args.d):
if file.endswith(".spk"):
print file
fuzzer = subprocess.call(['generic_send_tcp', args.i, args.p, file, args.v, args.s])
Directory()
如果您想了解更多信息,请给我留言,我会尽力提供。
干杯,
阿杰
关于 argparse
的使用,唯一明显的问题是 nargs=1
的使用。这样一来,值将是一个元素列表,而不是字符串。将其关闭(或使用默认值 nargs=None
),值将是字符串。
解析后打印args
,可以清楚地知道解析了什么。如果需要打印选定的值,例如。 args.v
.
打印这一行:
['generic_send_tcp', args.i, args.p, file, args.v, args.s]
我从错误中猜测 args.p
是 ['21']
而它应该只是 '21'
.
元变量、名称等的选择只是样式问题,不会影响运行。
In [360]: p=argparse.ArgumentParser()
In [361]: p.add_argument('-f',nargs=1)
Out[361]: _StoreAction(option_strings=['-f'], dest='f', nargs=1, const=None, default=None, type=None, choices=None, help=None, metavar=None)
In [362]: p.parse_args(['-f','12'])
Out[362]: Namespace(f=['12'])
我知道这个问题已经被问了很多,但是通过拖网搜索给出的答案:
- 没有解决我的问题
- 与我所看到的完全不相关
总的来说,我对编码还比较陌生,这是我第一次尝试使用 argparse。
基本上我的脚本出现以下错误:
TypeError: execv() arg 2 must contain only strings
我正在尝试为 Spike Fuzzer 编写一个非常简单的包装器,当我将参数 -p、-v 和 -s 静态设置为整数(不使用 argparse)时,脚本运行没有问题。当我尝试为它们使用参数时,我看到了上述错误。
请看下面的代码:
import argparse, subprocess, os, sys
parser = argparse.ArgumentParser(prog='fuzz.py',
usage='%(prog)s -i 127.0.0.1 -p 21 -d /root/example -v 0 -s 0',
)
parser.add_argument('--version', action='version', version='[+] Version: BETA')
parser.add_argument('-i', metavar='127.0.0.1',
help="IP Address"
)
parser.add_argument('-p',
type=int,
default=21,
metavar='21',
nargs=1,
help="Port (Default 21)",
)
parser.add_argument('-d', metavar='/root/example',
help="Spike script directory"
)
parser.add_argument('-f', metavar='example.spk',
nargs=1,
help="Spike File"
)
parser.add_argument('-v',
type=int,
default=0,
metavar='0',
nargs=1,
help="SKIPVAR (Default 0)",
)
parser.add_argument('-s',
type=int,
default=0,
metavar='0',
nargs=1,
help="SKIPSTR (Default 0)",
)
args = parser.parse_args()
def Directory():
for file in os.listdir(args.d):
if file.endswith(".spk"):
print file
fuzzer = subprocess.call(['generic_send_tcp', args.i, args.p, file, args.v, args.s])
Directory()
如果您想了解更多信息,请给我留言,我会尽力提供。
干杯, 阿杰
关于 argparse
的使用,唯一明显的问题是 nargs=1
的使用。这样一来,值将是一个元素列表,而不是字符串。将其关闭(或使用默认值 nargs=None
),值将是字符串。
解析后打印args
,可以清楚地知道解析了什么。如果需要打印选定的值,例如。 args.v
.
打印这一行:
['generic_send_tcp', args.i, args.p, file, args.v, args.s]
我从错误中猜测 args.p
是 ['21']
而它应该只是 '21'
.
元变量、名称等的选择只是样式问题,不会影响运行。
In [360]: p=argparse.ArgumentParser()
In [361]: p.add_argument('-f',nargs=1)
Out[361]: _StoreAction(option_strings=['-f'], dest='f', nargs=1, const=None, default=None, type=None, choices=None, help=None, metavar=None)
In [362]: p.parse_args(['-f','12'])
Out[362]: Namespace(f=['12'])