1

そこで「Violent 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 で、スキャン用に作成されています。ありがとう!

4

3 に答える 3

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,'-poptions.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(',')]

理解すべきもう 1 つのことは、を使用して文字列を分割すると、少なくとも1 つの要素.split()を持つリストになることです。

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

したがって、テストtgtPorts[0] == Noneは常に になりますFalse。はシングルトンであるため、通常の Python イディオムは( )の代わりにisforを使用することに注意してください。NonetgtPorts[0] is NoneNone

于 2013-07-23T10:56:23.243 に答える
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

コンマを削除するには、コマンド ラインでカンマを渡さないでください。または、本当に必要な場合は、変換できるように入力を処理します。

于 2013-07-23T10:51:57.820 に答える
0

変更した場合:

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

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

それはうまくいくはずですが、引数の解析のどこが間違っていたのかわかりません..

于 2013-07-23T10:55:29.590 に答える