0

「グローバル」に設定している変数を Python で呼び出す際に問題が発生しています。

スクリプトの先頭で変数を設定し、関数内で変数を変更しています。スクリプトの最後で、変数の値と、変数に設定している値を機能を実行していないようです。

スクリプト (PC の最初の 1000 ポートをスキャンする単純なポート スキャナー)。また、プロセスを使用してスクリプトをセットアップしている理由は、同時に複数のポート セクションを呼び出しているためです...ただし、かなり長いスクリプトであるため、すべての関数を含めていません。

#!/usr/bin/env python
import socket
import subprocess
import sys
from datetime import datetime
from multiprocessing import Process
import random
import datetime

# Clear the screen
#subprocess.call('clear', shell=True)

# Ask for input
#remoteServer    = raw_input("Enter a remote host to scan: ")
remoteServer = sys.argv[1]
remoteServerIP  = socket.gethostbyname(remoteServer)

global openports
openports = []

def ports1():
    global openports
    for port in random.sample(range(1,1000), 999):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.settimeout(.01)
        result = sock.connect_ex((remoteServerIP, port))
        if result == 0:
            openports.append(format(port))
        sock.close()


if __name__ == '__main__':
    p1 = Process(target = ports1)
    p1.start()
    p1.join()
    print openports

関数内から変数をエコーすると正しいデータが返されるため、変数が設定されていることはわかっていますがopenports、 name==main セクションで関数を呼び出した後にエコーすると、空として返されますストリング。

4

2 に答える 2

3

これは、ポートのクエリに別のプロセスを使用しているために発生します。親プロセスのopenports変数ではなく、そのプロセスの変数が更新されます!

複数の可能な解決策があります。

ports1()とにかく待っているだけなので、元のプロセスで関数を呼び出すことができます。

スキャナーを並列化したい場合は、 amultiprocessing.Poolを使用してポートスキャンを実行できます。プールで呼び出された関数は、開いているポートまたは閉じているポートのポート番号を返す可能性がありNoneます。例えば:

from multiprocessing import Pool
import random
import socket
import sys

remoteServer = sys.argv[1]
remoteServerIP  = socket.gethostbyname(remoteServer)

ports = random.sample(range(1,1000), 999)

def testport(num):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.settimeout(.01)
    result = sock.connect_ex((remoteServerIP, port))
    sock.close()
    if result == 0:
        return num
    return None

p = Pool()
openports = p.map(testport, ports)
openports = [prt for prt in openports if prt is not None]
于 2015-12-24T16:13:43.160 に答える
0

global最初に定義した場所からキーワードを削除してみてください。そこでリストとして定義し、global変更する前に関数内でキーワードを使用できると思います。印刷すると正しい結果が得られますか?

于 2015-12-24T16:15:07.937 に答える