无法在函数

时间:2015-12-24 16:06:36

标签: python function multiprocessing port-scanning

我在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变量,它将返回正确的数据,但是当我在名称中调用函数后回显它时==主要部分,它返回一个空字符串。

2 个答案:

答案 0 :(得分:3)

这是因为您使用单独的进程来查询端口。该流程中的--storageEngine变量 已更新,而不是父流程中的变量!

有多种可能的解决方案。

您可以在原始流程中调用openports功能,因为您无论如何都在等待它。

如果要对扫描仪进行并行化,可以使用ports1()进行端口扫描。池中调用的函数可以返回打开端口的端口号,或者为关闭的端口返回multiprocessing.Pool。例如:

None

答案 1 :(得分:0)

尝试从您定义它的第一个位置删除global关键字。我相信您可以将其定义为列表,然后在更改之前使用函数内的global关键字。那么打印出来的时候会给你正确的结果吗?