Python编写远程控制工具--主控端的编写

2024-02-11 01:04

本文主要是介绍Python编写远程控制工具--主控端的编写,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

主控端的编写

 

主控端的部分函数与被控端无异,因此笔者对相同的函数不再赘述,下面是 实现主要功能的具体步骤。

1)编写主函数并导入相关模块。主控端需要开启监听等待被控端的回连,

当接收到被控端的回连时,输出被控端的主机名,并给出功能选择的提示。在主 控端选择功能的同时,也要将交互数据传送给被控端,使其根据我们的操作在相 应的功能函数中待命:

#!/usr/bin/python3

# -*- coding: utf-8 -*-

 

import socket

import os

import struct

 

if __name__ == '__main__ ' :

# 主控端监听地址

serverIP = '127 .0 .0 .1 '

# 主控端监听端口

serverPort = 6666

serverAddr = (serverIP, serverPort)

# 主控端开始监听

try:

serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) serverSocket.bind(serverAddr)

serverSocket.listen(1)

except socket.error as message:

print(message)

os ._exit(0)

print("[*]Server is up!!!")

conn, addr = serverSocket.accept()

# 接收并打印上线主机的主机名、地址和端口

hostName = conn .recv(1024)

print("[+]Host is up! \n ============ \n name:{0} ip:{1} \n port :{2} \n

============ \n" .format(bytes .decode(hostName), addr[0], addr[1])) try:

while True:

print("Functional selection:\n")

print("[1]ExecCommand \n[2]TransferFiles\n")

choice = input( '[None]>>> ')

# 给被控端发送指令,主控端进入相应的功能模块

if choice == '1 ' :

# 发送的命令为str型,需要用encode函数把命令转换为bytes型

conn .sendall( '1 ' .encode())

ExecCommand(conn, addr)

elif choice == '2 ' :

conn .sendall( '2 ' .encode())

TransferFiles(conn, addr)

elif choice == 'exit ' :

conn .sendall( 'exit ' .encode())

serverSocket.close()

break

except :

 

 

 

 

 

serverSocket.close()

 

2)编写命令执行函数。只需要把用户的命令传送给被控端执行,并接收被 控端回传的命令执行结果即可:

# 命令执行函数

def ExecCommand(conn, addr) :

while True:

command = input("[ExecCommand]>>> ")

if command == 'exit ' :

# 主控端退出相应模块时,也要通知客户端退出对应的功能模块

conn .sendall( 'exit ' .encode())

break

conn .sendall(command.encode())

result = conn .recv(10000) .decode()

print(result)

3)编写文件传输函数的主函数。这里的主函数与被控端的文件传输主函数  差别不大。主控端在上传文件时,需要传递upload关键字以及需要传送到被控端 文件的文件路径。在进行文件下载时,需要传递download关键字,以及需要下载 的被控端文件的文件路径:

# 文件传输函数

def TransferFiles(conn, addr) :

print("Usage: method filepath")

print("Example: upload /root/ms08067 | download /root/ms08067")

while True:

command = input("[TransferFiles]>>> ")

#对输入进行命令和参数分割

command List = command.split()

if command List[0] == 'exit ' :

# 主控端退出相应模块时,也要通知被控端退出对应的功能模块

conn .sendall( 'exit ' .encode())

break

# 若方法为download,则表示主控端需要获取被控端的文件

if command List[0] == 'download ' :

Download File(conn, addr, command)

if command List[0] == 'upload ' :

Upload File(conn, addr, command)

4)编写文件传输的上传函数。传输的过程与被控端无异,只是主控端需要 先把命令发送给被控端,然后再执行文件上传:

# 文件上传函数

def Upload File(conn, addr, command) :

# 把主控端的命令发送给被控端

conn .sendall(command.encode())

#从命令中分离出要上传的文件的路径

command List = command.split()

while True:

upload FilePath = command List[1]

if os .path.isfile(upload FilePath) :

# 先传输文件信息,用来防止粘包

# 定义文件信息,128s表示文件名长度为128字节,l表示用in t类型表示文件大小 # 把文件名和文件大小信息进行封装,发送给接收端

fileInfo = struct.pack( '128sl ', bytes(os .path.basename(upload FilePath) .

 

 

 

 

 

encode( 'utf-8 ')), os .stat(upload FilePath) .st_size)

conn .sendall(fileInfo)

print( '[+]FileInfo send success ! name:{0}  size:{1} ' .format(os . path.basename(upload FilePath), os .stat(upload FilePath) .st_  size))

# 开始传输文件的内容

print( '[+]start uploading . . . ')

with open(upload FilePath, 'rb ') as f :

while True:

# 分块多次读,防止文件过大时一次性读完导致内存不足

data = f.read(1024)

if not data:

print("File Send Over !")

break

conn .sendall(data)

break

 

5)编写文件传输的下载函数。传输的过程与被控端无异,只是主控端需要 先把文件下载命令发送给被控端,然后再执行文件下载:

# 文件下载函数

def Download File(conn, addr, command) :

# 把主控端的命令发送给被控端

conn .sendall(command.encode())

while True:

# 先接收文件的信息,进行解析

# 长度自定义,先接收文件信息的主要原因是防止粘包

# 接收长度为128sl

fileInfo = conn .recv(struct.calcsize( '128sl '))

if fileInfo:

# 按照同样的格式(128sl)进行拆包

fileName, fileSize = struct.unpack( '128sl ', fileInfo)

# 要把文件名后面的多余空字符去除

fileName = fileName .decode() .strip( '\00 ')

# 定义上传文件的存放路径, ./表示当前目录下

newFilename = os .path.join( ' ./ ', fileName)

print( 'Fileinfo Receive over ! name:{0}  size:{1} ' .format

(fileName, fileSize))

# 接下来开始接收文件的内容

# 表示已经接收到的文件内容大小

recvdSize = 0

print( 'start receiving . . . ')

with open(newFilename, 'wb ') as f :

# 分次分块写入

while not recvdSize == fileSize:

if fileSize - recvdSize > 1024:

data = conn .recv(1024)

f.write(data)

recvdSize += len(data)

else:

# 当剩余内容不足1024时,则把剩下的全部内容都接收写入

data = conn .recv(fileSize - recvdSize)

f.write(data)

recvdSize = fileSize

break

print("File Receive over !!!")

break

 

 

这篇关于Python编写远程控制工具--主控端的编写的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/698453

相关文章

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

高效录音转文字:2024年四大工具精选!

在快节奏的工作生活中,能够快速将录音转换成文字是一项非常实用的能力。特别是在需要记录会议纪要、讲座内容或者是采访素材的时候,一款优秀的在线录音转文字工具能派上大用场。以下推荐几个好用的录音转文字工具! 365在线转文字 直达链接:https://www.pdf365.cn/ 365在线转文字是一款提供在线录音转文字服务的工具,它以其高效、便捷的特点受到用户的青睐。用户无需下载安装任何软件,只

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

nudepy,一个有趣的 Python 库!

更多资料获取 📚 个人网站:ipengtao.com 大家好,今天为大家分享一个有趣的 Python 库 - nudepy。 Github地址:https://github.com/hhatto/nude.py 在图像处理和计算机视觉应用中,检测图像中的不适当内容(例如裸露图像)是一个重要的任务。nudepy 是一个基于 Python 的库,专门用于检测图像中的不适当内容。该

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

如何编写Linux PCIe设备驱动器 之二

如何编写Linux PCIe设备驱动器 之二 功能(capability)集功能(capability)APIs通过pci_bus_read_config完成功能存取功能APIs参数pos常量值PCI功能结构 PCI功能IDMSI功能电源功率管理功能 功能(capability)集 功能(capability)APIs int pcie_capability_read_wo