[Python学习日记-78] 基于 TCP 的 socket 开发项目 —— 模拟 SSH 远程执行命令

[Python学习日记-78] 基于 TCP 的 socket 开发项目 —— 模拟 SSH 远程执行命令

简介

项目分析

如何执行系统命令并拿到结果

代码实现

简介

        在Python学习日记-77中我们介绍了 socket 基于 TCP 和基于 UDP 的套接字,还实现了服务器端和客户端的通信,本篇我们以此为基础来写一个基于模拟 SSH 远程执行命令的程序。

项目分析

        在实际的工作当中,我们所写的程序代码都是执行在一台服务器上面的,而这台服务器通常都比较昂贵,硬件价格还是其次的,当服务器上运行的系统是非常重要的时候那就更加会对安全性、可靠性、运行环境提出非常高的要求,例如要对服务器网络与办公网络进行隔离,用边界防火墙和服务器区防火墙进行隔离,机房的温度、湿度、防尘、消防、安防、供电等等的。

        上面说的这些已经超出了计算机系统的范畴了,但是确实目前的真实状况,像腾讯、阿里、电信、移动、联通这类大公司他们往往会建设自己的 IDC 机房,但是这无疑需要投入大量的资源,并不是每个公司都能负担得起的,这就催生出出租机柜的业务了(通常运行商在做),具体运营模式就是客户自己购买服务器之类的硬件设备,出租方提供机架位置,而且这个机架所在的机房都是符合一定标准的(可能是三级等保或者其他的),这样初创公司的几台服务器可以在极低的成本下也能享受 IDC 机房高规格的环境了。

        但是对于系统运维人员来说这就犯了大难了,以往服务器在公司,如果需要系统调整往往就直接跑到机房去对接服务器就可以了,那现在租的机架网往都在比较偏远的地方,也只有上架和架构调整时才会过去,那日常进行管理就会用到 SSH 协议来连接服务器进行管理了。

        其实 SSH 协议就是基于 socket 来与服务器进行远程连接通信的,它当然不会那么简单,它还会对信息进行加密等等的以保障传输信息的安全性和完整性,不过我们在这里模拟的只是它的远程执行命令的特性,总体的实现形式就是在客户端输入命令然后通过 TCP 协议的传输到达服务器端,最后由服务器端执行该命令。

        在这里介绍一下我们所说的命令是什么,我们现在常用的 x86 系统有两个分别是:Windows 和 LInux,而这两个系统的命令集各不相同,但是都类似,下面简单介绍两个系统的几条命令(后面测试会用上)

Windows 命令:

  • dir:查看某一个文件夹下的子文件名与子文件夹名
  • ipconfig:查看本地网卡的 IP 信息
  • tasklist:查看运行的进程

Linux 命令:

  • ls:查看某一个文件夹下的子文件名与子文件夹名
  • ifconfig:查看本地网卡的 IP 信息
  • ps aux:查看运行的进程

顺带一提:如果在运行服务器端的时候遇到了端口占用的情况,也能使用系统命令来解决

  • Windows:taskkill python
  • Linux: pkill -9 python

如何执行系统命令并拿到结果

        一提到执行系统命令很多小伙伴会第一时间想到 os 模块中的 system(cmd),但是这个方法只能直接打印在终端当中,返回的只有命令是否成功执行(0代表执行成功,非0代表执行失败),而我们想要达到执行系统命令并拿到执行结果的话则需要使用 subprocess 模块,以 WIndows 为例代码如下

import subprocess
obj = subprocess.Popen(r'dir C:\Users\Administrator',shell=True,  # shell就是命令启动器的意思stdout=subprocess.PIPE,  # subprocess.PIPE就是一个反射,实际上执行的是一个功能,每执行一次就是一条不同的管道stderr=subprocess.PIPE)print(obj)
print('stdout 1 --->: ',obj.stdout.read().decode('gbk'))
print('stderr 1 --->: ',obj.stderr.read().decode('gbk'))

代码输出如下:

        与下面的 Windows 中的 cmd 输出对比一下可以看出,是完全一致的

代码实现

服务器端:

import socket
import subprocessip_port = ('127.0.0.1',8080)
info_size = 1024server = socket.socket(family=socket.AF_INET,type=socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
server.bind(ip_port)
server.listen(5)print('starting...')
while True: # 链接循环conn,client_addr = server.accept()print('接到来自%s的接入' % client_addr[0])while True: # 通讯循环try:# 1、收命令cmd = conn.recv(info_size)if not cmd:break# 2、执行命令,拿到结果obj = subprocess.Popen(cmd.decode('utf-8'), shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)stdout = obj.stdout.read()stderr = obj.stderr.read()# 3、把命令的结果返回给客户端conn.send(stdout+stderr)    # stdout+stderr会产生新的内存空间,会有效率问题 ‘+’是一个可以优化的点except ConnectionResetError:breakconn.close()server.close()

客户端:

import socketip_port = ('127.0.0.1',8080)
info_size = 1024client = socket.socket(family=socket.AF_INET,type=socket.SOCK_STREAM)
client.connect(ip_port)while True:# 1、发命令cmd = input('>>: ').strip()if not cmd:continueclient.send(cmd.encode('utf-8'))# 2、拿到执行命令的结果,并打印data = client.recv(info_size)   # 这里的最大长度设定为1024是个坑,在后面会进行改进print(data.decode('gbk'))   # 由于我们使用的是Windows系统进行测试,所以我们使用gbk编码格式,如果使用的是Linux系统则使用utf-8编码格式client.close()

代码输出如下:

        可以看出,已经成功通过客户端输入命令远程让服务器端执行命令并返回结果了,但是也出现了一些问题,如下图所示

        客户端的第一条 dir 查询命令并没有输出完毕,并且影响到了第二条 ipconfig 命令的执行了,这里出现的问题就和客户端的 recv(info_size) 中的最大接收字节数有关了,而且这个现象就是我们常说的粘包现象,在下一篇博客当中我们将会基于以上的代码来讲解粘包问题,并把它给解决掉。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/68519.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

内联变量(inline variables):在多个文件中共享全局常量

在 C17 中,引入了 内联变量(inline variables) 的概念,可以用于在多个文件中共享全局常量。内联变量允许在头文件中定义变量,而不会导致链接错误(如重复定义)。这种方式非常适合用于定义跨多个文…

lvm快照备份技术详细知识点

一、LVM 简介 LVM(Logical Volume Manager)即逻辑卷管理器,是 Linux 系统中用于管理磁盘存储的关键技术。在传统磁盘管理方式下,磁盘分区一旦确定,其大小调整往往较为复杂,且难以灵活应对业务变化。LVM 则…

多种vue前端框架介绍

学如逆水行舟,不进则退。 在现今的软件开发领域,Vue.js凭借其高效、灵活和易于上手的特性,成为了前端开发的热门选择。对于需要快速搭建企业级后台管理系统的开发者而言,使用现成的Vue后台管理系统模板无疑是一个明智之举。 本文…

opencv3.4 ffmpeg3.4 arm-linux 交叉编译

一些依赖安装: sudo apt-get install pkg-config libgtk2.0-dev libavcodec-dev libavformat-dev libswscale-dev 交叉编译工具链准备:gcc-linaro-6.3.1 1、下载 https://github.com/FFmpeg/FFmpeg 解压后新建目录:Fmpeg-n3.4.13/ffmpeg…

使用SIPP发起媒体流性能测试详解

使用SIPP发起媒体流性能测试详解 一、SIPP工具简介二、测试前的准备三、编写测试脚本四、运行测试五、分析测试结果六、总结SIPP(SIP Performance Protocol)是一个开源工具,专门用于SIP(Session Initiation Protocol)协议的性能测试和基准测试。SIP是一种用于控制多媒体通…

SDL2:Android APP编译使用 -- SDL2多媒体库使用音频实例

更多内容:XiaoJ的知识星球 SDL2:Android APP编译使用 3. SDL2:Android APP编译使用3.1 Android Studio环境准备:3.2 构建Android APP(1)方式一:快速构建APK工程(2)方式二…

macOS 安装JDK17

文章目录 前言介绍新特性下载安装1.下载完成后打开downloads 双击进行安装2.配置环境变量3.测试快速切换JDK 小结 前言 近期找开源软件,发现很多都已经使用JDK17springboot3 了,之前的JDK8已经被替换下场,所以今天就在本机安装了JDK17&#…

重温STM32之环境安装

缩写 CMSIS:common microcontroller software interface standard 1,keil mdk安装 链接 Keil Product Downloads 安装好后,开始安装平台软件支持包(keil 5后不在默认支持所有的平台软件开发包,需要自行下载&#…

vue3+ts+uniapp 微信小程序(第一篇)—— 微信小程序定位授权,位置信息权限授权

文章目录 简介一、先看效果1.1 授权定位前,先弹出隐私协议弹框1.2 上述弹框点击同意,得到如下弹框1.3 点击三个点,然后点设置 1.4 在1.2步骤下,无论同意或者拒绝 二、manifest.json 文件配置三、微信公众平台配置3.1 登录进入微信…

迅为RK3568开发板篇OpenHarmony实操HDF驱动控制LED-编写内核 LED HDF 驱动程序

接下来编译 LED 驱动,该驱动用于在基于华为设备框架(HDF)的系统中控制 LED 灯的开关,完整代码如下所示: 更多内容可以关注:迅为RK3568开发板篇OpenHarmony

AUTOSAR从入门到精通-无人驾驶网约车(Robotaxi)

目录 前言 几个高频面试题目 特斯拉的Robotaxi和萝卜快跑对比 ▍1. 技术基础与实现 ▍2. 定价 ▍3. 外观设计 算法原理 什么是Robotaxi? Robotaxi与自动驾驶的关系 定义自动驾驶及其分级(0级到5级) Robotaxi在自动驾驶技术中的应用和定位 1 Robotaxi的内涵与优势…

kafka集群安装Raft 协议

​使用消息中间件,可以实现系统与系统之间的异步通信和无缝对接,也可用在模块之间的的异步通信,有效避免了同步阻塞IO。作为一个高吞吐量、可扩展、高可靠性的分布式消息系统,Kafka 能够胜任从简单的消息队列到复杂的流处理平台的…

Java 接口安全指南

Java 接口安全指南 概述 在现代 Web 应用中,接口(API)是前后端交互的核心。然而,接口的安全性常常被忽视,导致数据泄露、未授权访问等安全问题。本文将详细介绍 Java 中如何保障接口安全,涵盖以下内容&am…

华为AI培训-NLP实验

中文分词、命名实体识别、语义词性标注、语句逻辑推理、文本摘要、机器翻译、文本情感分析、内容创作 1 实验介绍 1.1 实验背景 中文分词、命名实体识别、语义词性标注、语句逻辑推理是自然语言处理领域中的重要任务。中文分词是将连续的汉字序列切分成有意义的词语序列…

Flask学习入门笔记

Flask学习入门笔记 前言1. 安装Flask2. 创建一个简单的Flask应用3. 路由与视图函数3.1 基本路由3.2 动态路由3.3 HTTP方法 4. 请求与响应4.1 获取请求数据4.2 返回响应 5. 模板渲染5.1 基本模板渲染5.2 模板继承 6. 静态文件6.1 静态文件的目录结构6.2 在模板中引用静态文件6.2…

citrix netscaler13.1 重写负载均衡响应头(基础版)

在 Citrix NetScaler 13.1 中,Rewrite Actions 用于对负载均衡响应进行修改,包括替换、删除和插入 HTTP 响应头。这些操作可以通过自定义策略来完成,帮助你根据需求调整请求内容。以下是三种常见的操作: 1. Replace (替换响应头)…

【Web】2025西湖论剑·中国杭州网络安全安全技能大赛题解(全)

目录 Rank-l Rank-U sqli or not Rank-l username存在报错回显,发现可以打SSTI 本地起一个服务,折半查找fuzz黑名单,不断扔给fenjing去迭代改payload from flask import Flask, request, render_template_stringapp Flask(__name__)app…

【C】PAT 1011-1015

1011 AB和C 给定区间 [−231,231] 内的 3 个整数 A、B 和 C,请判断 AB 是否大于 C。 输入格式: 输入第 1 行给出正整数 T (≤10),是测试用例的个数。随后给出 T 组测试用例,每组占一行,顺序给出 A、B 和 C。整数间以…

WEB渗透技术研究与安全防御

目录 作品简介I IntroductionII 1 网络面临的主要威胁1 1.1 技术安全1 2 分析Web渗透技术2 2.1 Web渗透技术的概念2 2.2 Web漏洞产生的原因2 2.3 注入测试3 2.3.1 注入测试的攻击流程3 2.3.2 进行一次完整的Sql注入测试4 2.3.3 Cookie注入攻击11 3 安全防御方案设计…

软考高级5个资格、中级常考4个资格简介及难易程度排序

一、软考高级5个资格 01、网络规划设计师 资格简介:网络规划设计师要求考生具备全面的网络规划、设计、部署和管理能力;该资格考试适合那些在网络规划和设计方面具有较好理论基础和较丰富从业经验的人员参加。 02、系统分析师 资格简介:系统分…