这应该很简单。但它现在真的得到了我。我已经设置了一个简单的argparse,并希望能够分割一个字符串,如果它有一个减号。听起来很简单,但是当项目被解析为argparse时,它会显示为空白。所以我会告诉你我想做什么以及为什么它让我感到困惑。注意:我很难将其指定为字符串。 dir和type函数显示为空白。
import argparse
import sys
portlist = []
#Parser Arguments and Usage
parser = argparse.ArgumentParser(description='This script performs a Syn scan on a specific host with the ports that are specified by you.', usage='Specify Ports with the -p switch. Port range -p 80-200, specific port -p 80, multiple ports -p 80,443,25,22', add_help=True)
parser.add_argument('-p', action='store', dest='argPorts', help='Type ports in like follows. For a range -p 80-200, for a group of ports -p 443,80,25,22 or single port -p 80', required=True, type=str)
parser.add_argument('-d', action='store', dest='destIP', help='Type dest IP in this field. i.e. 192.168.0.5', required=True)
parser.add_argument('-t', action='store', dest='threadCount', help='Type the amount of threads to use as an integer', type=int, required=True)
if len(sys.argv)<3:
parser.print_help()
sys.exit(0)
opts = vars(parser.parse_args())
options = parser.parse_args()
argPorts = options.argPorts
destIP = options.destIP
threadCount = options.threadCount
if argPorts.find(','):
print "comma"
for p in argPorts.split(','):
portlist.append(p)
elif argPorts.find('-'):
print "range"
portlist.append(argPorts.split('-')[0])
portlist.append(argPorts.split('-')[1])
else:
print "no"
print portlist
我正在使用命令行,如下所示。 python test.py -t 10 -p&#34; 80-100&#34; -d&#34; 192.168.136.131&#34;
我希望能够将80和100拆分为单独的变量。但它不起作用:(
下面的答案很棒。
对于像我这样的其他人http://www.pythoncentral.io/how-to-see-if-a-string-contains-another-string-in-python/
,这是一个很好的解释答案 0 :(得分:1)
问题是,如果找不到搜索字符串,则.find()返回-1。因此,您无法仅通过存在来检查这一点。
你可以尝试这样的事情:if argPorts.find(',') != -1:
...
elif argPorts.find('-') != -1:
...
我更喜欢这样的事情:
if ',' in argPorts:
print("comma")
for p in argPorts.split(','):
portlist.append(p)
elif '-' in argPorts:
print("range")
portlist.append(argPorts.split('-')[0])
portlist.append(argPorts.split('-')[1])
else:
print("no")
附加。我想,如果给出范围,你想要创建一个端口列表。
for port in range(int(argPorts.split('-')[0]), int(argPorts.split('-')[1])+1):
portlist.append(port)
答案 1 :(得分:1)
您可以将端口解析逻辑移动到一个函数中,并将其作为type
传递给您的add_argument('-p')
,并添加一些用户友好的异常,如此
def parse_port(port):
if port.isdigit():
return int(port)
else:
raise argparse.ArgumentTypeError(
"'{}' is not a valid port".format(port))
def parse_port_range(port_range):
range_members = port_range.split("-")
if len(range_members) != 2:
raise argparse.ArgumentTypeError(
"'{}' is not a valid port range".format(port_range))
actual_range = range(parse_port(range_members[0]),
parse_port(range_members[1]) + 1)
return actual_range
def parse_ports(port_string):
#first break commas
port_groups = port_string
if ',' in port_string:
port_groups = port_string.split(",")
#then figure out ranges and populate the set of ports
ports = set()
for port_group in port_groups:
if "-" in port_group:
port_range = parse_port_range(port_group)
ports.update(port_range)
else: # single port
ports.add(parse_port(port_group))
return list(ports)
#finally create your CLI argument
parser.add_argument('-p', dest='argPorts', type=parse_ports,
help=('Type ports in like follows. For a range -p 80-200, '
'for a group of ports -p 443,80-200,25,22 or single '
'port -p 80'))
在parser.parse_args()
之后,您的options.argPorts
包含整数端口列表,如果端口输入错误,则用户会收到有用的消息。