我有一個TCP客戶端 - 服務器,其中客戶端向服務器發送shell命令,服務器使用所述命令的輸出進行響應。某些命令(如 date 或 cd)不起作用,因為它們是交互式的,我假設我的代碼不處理它。每當我發送上述命令時,我的客戶端似乎都掛起了,只是說發送...我的服務器從未收到任何東西。我想弄清楚如何處理這種情況,如果發送命令需要超過5秒的時間,客戶端將導致超時,或者只是處理它并打印一條消息,指出命令未成功執行,同時保持客戶端連接到服務器。這是我的代碼客戶:import socket# Clientsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # creates TCP Socket# local host and portLOCAL_HOST = '127.0.0.1'PORT = 5313BUFFER_SIZE = 5000 # size of messagesock.settimeout(5)# connect socket to ip and portsock.connect((LOCAL_HOST, PORT))print("Connected to server\n")print("Enter quit to close connection\n")while True: message = input("Please enter a command:\n") # ask user to input message if message == 'quit': break if len(message) == 0: print("Please enter something") message = input("Please enter a command:\n") 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()服務器:import socketimport subprocess# Server# Some commands do not work such as cd. Date does not work on windows because it is interactive.# creates TCP socketsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock.settimeout(5)# port and server ip(localhost)LOCAL_HOST = ''PORT = 5313BUFFER_SIZE = 5000 # size of message# test connectionprint("Server starting up on %s with port number %s" % (LOCAL_HOST, PORT))# bind socket to ip and portsock.bind((LOCAL_HOST, PORT))# listen to socketsock.listen(1)
1 回答

繁星coding
TA貢獻1797條經驗 獲得超4個贊
有多種方法可以做到這一點,但可能最簡單的方法是調用subprocess.check_output()方法,該方法允許您以秒為單位指定超時值,并且還返回子進程生成的文本,即:
[...]
while True:
command = connection.recv(BUFFER_SIZE) # receive message from client
if not command:
break
command = command.decode("utf-8").strip()
if len(command) > 0:
try:
output_as_string = subprocess.check_output(command, stderr=subprocess.STDOUT, shell=True, timeout=5.0).decode("utf-8")
except subprocess.TimeoutExpired:
output_as_string = "Sub-process timed out!\r\n"
connection.send(str.encode("0:") + str.encode(output_as_string))
[...]
添加回答
舉報
0/150
提交
取消