2014-09-06 34 views
0

這應該很簡單。但現在真的到了我的面前。我已經設置了一個簡單的argparse,希望能夠拆分一個字符串,如果它有一個減號。聽起來很簡單,但是當項目被解析爲argparse時,它會變成空白。所以我會告訴你我想做什麼以及爲什麼它令我困惑。注意:我很難將它指定爲一個字符串。目錄和類型函數空白。Python Argparse無法分割字符串

 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「80-100」-d「192.168.136.131」

我希望能夠分開80和100來分隔變量。但它不工作:(以下

答案是偉大的。

下面是其他人跟我一樣http://www.pythoncentral.io/how-to-see-if-a-string-contains-another-string-in-python/

+0

Omg謝謝你這麼多。它一直在殺死我的生命。請注意,我仍在學習python。 – 2014-09-06 08:31:07

+0

標題誤導 - 問題發生在'argparse'完成後字符串的處理中。 – hpaulj 2014-09-06 17:29:15

回答

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) 
0

您可以將端口的分析邏輯爲功能,並把它作爲一個typeadd_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包含整數端口列表,如果端口輸入錯誤,用戶將收到一條有用的消息。