optparse не собирает все значения, переданные опции

Я работаю над простым сканером портов и хочу, чтобы моя программа принимала два параметра при выполнении командной оболочкой. В общем случае его можно запустить только из оболочки, так как параметры программы абсолютно необходимы.

Я хочу, чтобы варианты были:

-H: IP-адрес хоста

-p: список всех портов, которые необходимо просканировать

Вот моя проблема: я хочу, чтобы порты были разделены запятой и пробелом, как в этом примере запуска моей программы:

D:\LocalUser\MyPython\Portscanner>C:\Users\LocalUser\AppData\Local\Programs\Pytho n\Python35-32\python.exe portscanner_v0.0.py -H 192.168.1.1 -p 21, 1720, 8000

К сожалению, они, похоже, не все собираются моей программой. Только первое значение второго параметра считывается в мою переменную в моем коде. Я использую optparse и Python 3.5, подскажите, пожалуйста, как получить ВСЕ порты из оболочки.

Вот мой код:

def portScan(tgtHost, tgtPorts):
    #doing my port scans
    #wont show my actual code here, it's working fine


def main():
    parser = optparse.OptionParser('usage%prog ' + ' -H <target host> -p <target port>')
    parser.add_option('-H', dest='tgtHost', type='string', help='specify target Host')
    parser.add_option('-p', dest='tgtPort', type='string', help='specify target port[s] separated by comma')
    (options, args) = parser.parse_args()
    tgtHost = options.tgtHost
    tgtPorts = str(options.tgtPort).split(', ')
    if ((tgtHost == None) | (tgtPorts[0]==None)):
        print(parser.usage)
        exit(0)
    portScan(tgtHost, tgtPorts)

if __name__ == "__main__":
    main()

person Community    schedule 02.09.2017    source источник


Ответы (1)


Арги уже разделены пробелами, поэтому вам нужно будет использовать

tgtPorts = str(options.tgtPort).split(',')

и назовите его как python.exe portscanner_v0.0.py -H 192.168.1.1 -p 21,1720,8000

Также обратите внимание, что модуль optparse устарел, начиная с Python 2.7, и заменен на argparse.

person bgse    schedule 02.09.2017
comment
Это сработало хорошо, спасибо! Нет ли способа использовать пробелы (просто спрашиваю...)? - person ; 02.09.2017