Python 向服务器发送空消息时客户端挂起
Python client hanging when sending empty message to server
我正在开发一个 python 反向 shell,它利用使用 TCP 的客户端-服务器连接。我现在正在我的本地主机 windows 机器上测试它们,我正在利用子进程库来处理命令。客户端应该向服务器发送命令,服务器将回复输出。
服务器:
import socket
import subprocess
import os
# Server
# creates TCP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# port and server ip(localhost)
LOCAL_HOST = '127.0.0.1'
PORT = 5565
BUFFER_SIZE = 5000 # size of message
no_char_message = "-1: Please enter a command"
# test connection
print("Server starting up on %s with port number %s" % (LOCAL_HOST, PORT))
# bind socket to ip and port
sock.bind((LOCAL_HOST, PORT))
# listen to socket
sock.listen(1)
# socket will accept connection and client address
print("Waiting for connection") # waiting for connection
connection, address = sock.accept() # accept connection with client address
print("Connected to", address) # connected by address
while True:
command = connection.recv(BUFFER_SIZE) # receive message from client
if not command:
break
if len(command) == 0:
connection.send(str.encode(no_char_message))
if len(command) > 0:
terminal = subprocess.Popen(command[:].decode("utf-8"), shell=True, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, stdin=subprocess.PIPE)
output = terminal.stdout.read() + terminal.stderr.read()
output_as_string = str(output, "utf-8")
connection.send(str.encode(output_as_string))
print(output_as_string)
print("Closing Server")
sock.close()
connection.close()
客户
import socket
# Client
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # creates TCP Socket
# local host and port
LOCAL_HOST = '127.0.0.1'
PORT = 5565
BUFFER_SIZE = 5000 # size of message
# connect socket to ip and port
sock.connect((LOCAL_HOST, PORT))
print("Connected to server\n")
while True:
message = input("Please enter a command:\n") # ask user to input message
if message == 'quit':
break
print("Sending %s" % message)
sock.send(str.encode(message)) # send message
command = str(sock.recv(BUFFER_SIZE), "utf-8") # receive message
print("received %s" % command)
print("closing connection with server")
sock.close()
问题是当我向服务器发送一条空消息时它挂起,只是说在终端发送,而服务器从未收到任何东西。我不确定是什么原因造成的,但我假设管道被阻塞或者我没有正确处理这个问题。
我希望服务器 return 向客户端发送错误消息,而不是在客户端本身处理消息错误。
我尝试检查命令的长度是否为 0 的条件并使用错误消息处理它,但它没有工作并且仍然挂起。
当我尝试 date 命令时,程序似乎也挂起。
一般情况下,命令无法识别、为空或执行不成功如何处理?
TCP没有空消息的概念。 TCP 根本没有消息的概念,它只知道字节。因此,如果您使用空字符串调用 send,它只会向服务器发送任何内容(不是空数据包,而是根本没有数据包),这意味着服务器无法接收任何内容 - 它仍然会在等待数据时阻塞。换句话说:没有空命令,根本就没有注释。
if len(command) == 0:
这不会检查空消息(同样不存在),但会在客户端关闭连接时触发。必须已经在客户端完成对空命令的任何检查。
我正在开发一个 python 反向 shell,它利用使用 TCP 的客户端-服务器连接。我现在正在我的本地主机 windows 机器上测试它们,我正在利用子进程库来处理命令。客户端应该向服务器发送命令,服务器将回复输出。
服务器:
import socket
import subprocess
import os
# Server
# creates TCP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# port and server ip(localhost)
LOCAL_HOST = '127.0.0.1'
PORT = 5565
BUFFER_SIZE = 5000 # size of message
no_char_message = "-1: Please enter a command"
# test connection
print("Server starting up on %s with port number %s" % (LOCAL_HOST, PORT))
# bind socket to ip and port
sock.bind((LOCAL_HOST, PORT))
# listen to socket
sock.listen(1)
# socket will accept connection and client address
print("Waiting for connection") # waiting for connection
connection, address = sock.accept() # accept connection with client address
print("Connected to", address) # connected by address
while True:
command = connection.recv(BUFFER_SIZE) # receive message from client
if not command:
break
if len(command) == 0:
connection.send(str.encode(no_char_message))
if len(command) > 0:
terminal = subprocess.Popen(command[:].decode("utf-8"), shell=True, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, stdin=subprocess.PIPE)
output = terminal.stdout.read() + terminal.stderr.read()
output_as_string = str(output, "utf-8")
connection.send(str.encode(output_as_string))
print(output_as_string)
print("Closing Server")
sock.close()
connection.close()
客户
import socket
# Client
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # creates TCP Socket
# local host and port
LOCAL_HOST = '127.0.0.1'
PORT = 5565
BUFFER_SIZE = 5000 # size of message
# connect socket to ip and port
sock.connect((LOCAL_HOST, PORT))
print("Connected to server\n")
while True:
message = input("Please enter a command:\n") # ask user to input message
if message == 'quit':
break
print("Sending %s" % message)
sock.send(str.encode(message)) # send message
command = str(sock.recv(BUFFER_SIZE), "utf-8") # receive message
print("received %s" % command)
print("closing connection with server")
sock.close()
问题是当我向服务器发送一条空消息时它挂起,只是说在终端发送,而服务器从未收到任何东西。我不确定是什么原因造成的,但我假设管道被阻塞或者我没有正确处理这个问题。
我希望服务器 return 向客户端发送错误消息,而不是在客户端本身处理消息错误。
我尝试检查命令的长度是否为 0 的条件并使用错误消息处理它,但它没有工作并且仍然挂起。
当我尝试 date 命令时,程序似乎也挂起。
一般情况下,命令无法识别、为空或执行不成功如何处理?
TCP没有空消息的概念。 TCP 根本没有消息的概念,它只知道字节。因此,如果您使用空字符串调用 send,它只会向服务器发送任何内容(不是空数据包,而是根本没有数据包),这意味着服务器无法接收任何内容 - 它仍然会在等待数据时阻塞。换句话说:没有空命令,根本就没有注释。
if len(command) == 0:
这不会检查空消息(同样不存在),但会在客户端关闭连接时触发。必须已经在客户端完成对空命令的任何检查。