2013-07-23 54 views
1

所以我正在學習Python和從「暴力蟒」,同時黑客和我遇到了一個問題 這裏是我的代碼:暴力的Python:端口輸入沒有被分隔

import optparse 
import socket 
from socket import * 
from threading import * 

screenLock = Semaphore(value = 1) 

def connScan(tgtHost, tgtPort): 
    try: 
     connSkt = socket(AF_INET, SOCK_STREAM) 
     connSkt.connect((tgtHost, tgtPort)) 
     connSkt.send('ViolentPython\r\n') 
     results = connSkt.recv(100) 
     screenLock.acquire() 
     print '[+]%d/tcp open' %tgtPort 
     print '[+] ' + str(results) 
    except: 
     screenLock.acquire() 
     print '[-]%d/tcp closed' %tgtPort 
    finally: 
     screenLock.release() 
     connSkt.close() 
def portScan(tgtHost, tgtPorts): 
    try: 
     tgtIP = gethostbyname(tgtHost) 
    except: 
     print "[-] Cannot resolve '%s': Unknown host" %tgtHost 
     return 
    try: 
     tgtName = gethostbyaddr(tgtIP) 
     print '\n[+] Scan Results for ' +tgtName[0] 
    except: 
     print '\n[+] Scan Results for ' +tgtIP 
    setdefaulttimeout(10) 
    for tgtPort in tgtPorts: 
     print 'Scanning port ' +tgtPort 
     t = Thread(target=connScan, args=(tgtHost, int(tgtPort))) 
     t.start() 
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] seperated by a 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() 

運行程序我得到以下錯誤信息:

File "port_scanner.py", line 54, in <module> 
    main() 
    File "port_scanner.py", line 52, in main 
    portScan(tgtHost, tgtPorts) 
    File "port_scanner.py", line 37, in portScan 
    t = Thread(target=connScan, args=(tgtHost, int(tgtPort))) 
ValueError: invalid literal for int() with base 10: '21,' 

任何人都可以請幫忙嗎?我仍然在這個新的,但我的猜測是Python是不運行這個指令分離的不同端口,我輸入:

python port_scanner.py -H 74.207.244.221 -p 21, 22, 80 

我針對的IP是scanme.org和掃描製成。謝謝!

+0

我認爲'optparse'將字符串解析爲第一個空格。試試這個:'python port_scanner.py -H 74.207.244.221 -p「21,22,80」' –

+0

你可以用python port_scanner.py -H 74.207.244.221 -p 21,22,80 –

+0

啓動它Daniel說的,但你也需要改變代碼來分割使用'「,」'而不是'「,」'。 'int()'可以跳過空格,所以它應該可以正常工作。 –

回答

6

首先,你是誤解你的命令行是如何被解析的。

你傳入:

python port_scanner.py -H 74.207.244.221 -p 21, 22, 80 

這意味着Python看到:

['-H', '74.207.244.221', '-p', '21,', '22,', '80'] 

optparse.OptionParser從而解析只是'21,'作爲-p開關的值。因此,options.tgtPort設置爲'21,',並且該值的.split(', ')導致['21,'],因爲該輸入字符串中存在', '(逗號和空格)。

要在參數空間中,使用引用命令行:

python port_scanner.py -H 74.207.244.221 -p "21, 22, 80" 

,但你真的要調整你的命令行解析分裂只是逗號和容忍空格代替:

tgtPorts = [p.strip() for p in options.tgtPort.split(',')] 

另一件要明白的是,利用拆分一個.split()字符串將導致與至少一個元素的列表:

>>> 'foo'.split(',') 
['foo'] 

因此您對tgtPorts[0] == None的測試將始終爲False。請注意,正常的Python成語是用is代替None而不是(tgtPorts[0] is None),因爲None是單身人士。

+0

非常感謝!這真的幫了我很多! –

0

您的端口值有逗號,所以Python無法將字符串順利轉換爲整數。您可以輕鬆地在翻譯中重現此例外情況:

>>> int("2,") 

Traceback (most recent call last): 
File "<pyshell#27>", line 1, in <module> 
int("2,") 
ValueError: invalid literal for int() with base 10: '2,' 
>>> int("2") 
2 

要刪除逗號,不要在命令行中傳入它。或者,如果您真的必須處理輸入,以便可以進行轉換。

0

如果你改變:

t = Thread(target=connScan, args=(tgtHost, int(tgtPort))) 

t = Thread(target=connScan, args=(tgtHost, int(tgtPort.strip(",")))) 

它應該工作,凡在參數解析它去錯了,雖然不知道..