简体   繁体   English

“ AttributeError”我在做什么错?

[英]“AttributeError” What am I doing wrong here?

I'm developing a server monitoring utility in Python that I want to work on everything from macOS to Haiku. 我正在用Python开发服务器监控实用程序,我想在从macOS到Haiku的所有内容上工作。 It's split into a client that connects to and queries multiple servers. 它分为一个客户端,该客户端连接到并查询多个服务器。 Right now I'm testing the client on a macOS host with the server running on Debian in a Parallels VM. 现在,我正在使用在Parallels VM中的Debian上运行的服务器在macOS主机上测试客户端。 However, I didn't commit the new changes I made that did work to GitHub, and then made some changes that broke the whole thing. 但是,我没有犯我做了那样的工作GitHub上,然后做了一些改变,打破了整个事情的新变化。 I'm only going to include the parts of my code that are relevant. 我将只包括我代码中相关的部分。

This is from the client. 这是从客户端来的。

def getServerInfoByName(serverName):
    serverIndex = serverNames.index(serverName)
    serverAddress = serverAddressList[serverIndex]
    serverPort = serverPorts[serverIndex]
    serverUsername = serverUsernames[serverIndex]
    return serverAddress, serverPort, serverUsername



for server in serverNames:
    try:
        if server != None:
            serverInfo = getServerInfoByName(server)
            exec(server + "Socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)")
            exec(server + "Socket.connect(('" + serverInfo[0] + "', " + serverInfo[1] + "))")

    except ConnectionRefusedError:
        print("Could not establish a connection to " + server + ".")
        print(divider)
        sys.exit()




def clientLoop():
    sys.stdout.write(termcolors.BLUE + "-> " + termcolors.ENDC)
    commandInput = input()
    splitCommand = commandInput.split(' ')
    whichServer = splitCommand[0]

    if splitCommand[0] == "exit":
        sys.exit()

    # Insert new one word client commands here

    elif len(splitCommand) < 2:
        print("Not enough arguments")
        print(divider)
        clientLoop()

    elif splitCommand[1] == "ssh":
        serverInfo = getServerInfoByName(whichServer)
        os.system("ssh " + serverInfo[2] + "@" + serverInfo[0])
        print(divider)
        clientLoop()

    # Insert new external commands above here (if any, perhaps FTP in the 
    # future).
    # NOTE: Must be recursive or else we'll crash with an IndexError
    # TODO: Possibly just catch the exception and use that to restart the 
    # function

    else:
        whichServer = splitCommand[0]
        commandToServer = splitCommand[1]
        exec(whichServer + "Socket.send(commandToServer.encode('utf-8'))")

        response = exec(whichServer + "Socket.recv(1024)")
        print(response.decode('utf-8'))
        print(divider)
        clientLoop()

clientLoop()

And this is from the server. 这是来自服务器的。

### Start the server

try:
    incomingSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    incomingSocket.bind((address, port))

except OSError:
    print("The configured address is already in use.")
    print("The problem should solve itself in a few seconds.")
    print("Otherwise, make sure no other services are using")
    print("the configured address.")
    sys.exit()

incomingSocket.listen(1)

### Main loop for the server
while True:

    clientSocket, clientAddress = incomingSocket.accept()
    incomingCommand = clientSocket.recv(1024)
    command = incomingCommand.decode('utf-8')

    if command != None:
        if command == "os":
            clientSocket.send(osinfo[0].encode('utf-8'))

        elif command == "hostname":
            clientSocket.send(osinfo[1].encode('utf-8'))

        elif command == "kernel":
            clientSocket.send(osinfo[2].encode('utf-8'))

        elif command == "arch":
            clientSocket.send(osinfo[3].encode('utf-8'))

        elif command == "cpu":
            cpuOverall = getOverall()
            cpuOverallMessage = "Overall CPU usage: " + str(cpuOverall) + "%"
            clientSocket.send(cpuOverallMessage.encode('utf-8'))

        elif command == "stopserver":
            incomingSocket.close()
            clientSocket.close()
            sys.exit()

        else:
            clientSocket.send("Invalid command".encode('utf-8'))

Any time I try to send a command to the server, the client crashes with AttributeError: 'NoneType' object has no attribute 'decode' as soon as it tries to decode the response from the server. 每当我尝试向服务器发送命令时,客户端都会因AttributeError: 'NoneType' object has no attribute 'decode'崩溃AttributeError: 'NoneType' object has no attribute 'decode'尝试对服务器的响应进行解码时, AttributeError: 'NoneType' object has no attribute 'decode' Eventually I want to encrypt the sockets with AES but I can't do that if it doesn't even work in plain text. 最终,我想用AES加密套接字,但是即使它不能以纯文本形式工作,也无法这样做。

exec does not return anything. exec不返回任何内容。 You should not generate variable names with exec but use dictionaries to store the sockets. 您不应使用exec生成变量名,而应使用字典来存储套接字。

servers = {}
for name, address, port, username in zip(serverNames, serverAddressList, serverPorts, serverUsernames):
    try:
      server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      server.connect((address, port))
      servers[name] = server, address, port, username
    except ConnectionRefusedError:
        print("Could not establish a connection to {}.".format(name))
        print(divider)
        sys.exit()

def client_loop():
    while True:
        sys.stdout.write("{}-> {}".format(termcolors.BLUE,termcolors.ENDC))
        command = input().split()
        which_server = command[0]

        if which_server == "exit":
            break
        elif len(command) < 2:
            print("Not enough arguments")
            print(divider)
        elif command[1] == "ssh":
            _, address, _, username = servers[which_server]
            os.system("ssh {}@{}".format(username, address))
            print(divider)
        else:
            server = servers[which_server][0]
            server.sendall(command[1].encode('utf-8'))
            response = server.recv(1024)
            print(response.decode('utf-8'))
            print(divider)

client_loop()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM