[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()
注意:obj = subprocess.Popen(cmd.decode('utf-8'), ...) 获取到的结果是以当前系统为准的,即 Windows 的 obj.stdout.read() 读出来的就是 GBK 编码,那么在客户端那边也要用 GBK 进行解码才行,并且只能从传输管道中读取一次结果。
客户端:
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) 中的最大接收字节数有关了,而且这个现象就是我们常说的粘包现象,在下一篇博客当中我们将会基于以上的代码来讲解粘包问题,并把它给解决掉。
相关文章:
[Python学习日记-78] 基于 TCP 的 socket 开发项目 —— 模拟 SSH 远程执行命令
[Python学习日记-78] 基于 TCP 的 socket 开发项目 —— 模拟 SSH 远程执行命令 简介 项目分析 如何执行系统命令并拿到结果 代码实现 简介 在Python学习日记-77中我们介绍了 socket 基于 TCP 和基于 UDP 的套接字,还实现了服务器端和客户端的通信,本…...
电子应用设计方案101:智能家庭AI喝水杯系统设计
智能家庭 AI 喝水杯系统设计 一、引言 智能家庭 AI 喝水杯系统旨在为用户提供个性化的饮水提醒和健康管理服务,帮助用户养成良好的饮水习惯。 二、系统概述 1. 系统目标 - 精确监测饮水量和饮水频率。 - 根据用户的身体状况和活动量,智能制定饮水计划。…...
vue学习路线
以下是一个详细的Vue学习路线: 一、基础入门 (一)环境搭建 1. 安装Node.js和npm:Vue项目依赖于Node.js环境,需从官网下载并安装最新版本的Node.js,npm会随Node.js一起安装。 2. 安装Vue CLI:V…...
(15)Chainlink Automation(定时任务) 详细介绍及用法
Chainlink Automation 详细介绍 1. 什么是 Chainlink Automation? Chainlink Automation 是 Chainlink 提供的一个去中心化服务,专门用于自动化执行智能合约的链上操作。它允许开发者基于时间或特定条件(如链上或链下事件)触发智…...
从入门到精通:RabbitMQ的深度探索与实战应用
目录 一、RabbitMQ 初相识 二、基础概念速览 (一)消息队列是什么 (二)RabbitMQ 核心组件 三、RabbitMQ 基本使用 (一)安装与环境搭建 (二)简单示例 (三)…...
基于微信小程序高校订餐系统的设计与开发ssm+论文源码调试讲解
第4章 系统设计 一个成功设计的系统在内容上必定是丰富的,在系统外观或系统功能上必定是对用户友好的。所以为了提升系统的价值,吸引更多的访问者访问系统,以及让来访用户可以花费更多时间停留在系统上,则表明该系统设计得比较专…...
【vitePress】基于github快速添加评论功能(giscus)
一.添加评论插件 使用giscus来做vitepress 的评论模块,使用也非常的简单,具体可以参考:giscus 文档,首先安装giscus npm i giscus/vue 二.giscus操作 打开giscus 文档,如下图所示,填入你的 github 用户…...
PID 控制算法(二):C 语言实现与应用
在本文中,我们将用 C 语言实现一个简单的 PID 控制器,并通过一个示例来演示如何使用 PID 控制算法来调整系统的状态(如温度、速度等)。同时,我们也会解释每个控制参数如何影响系统的表现。 什么是 PID 控制器…...
Git本地搭建
Git本地搭建 (项目突然不给创建仓库了,为了方便管理项目只能自己本地搭建git服务) 为了在本地搭建Git环境并实现基本的Git操作,步骤如下: 安装Git软件 Windows:从Git官方网站下载并安装适用于Windows…...
ORB-SLAM2源码学习:Initializer.cc⑧: Initializer::CheckRT检验三角化结果
前言 ORB-SLAM2源码学习:Initializer.cc⑦: Initializer::Triangulate特征点对的三角化_cv::svd::compute-CSDN博客 经过上面的三角化我们成功得到了三维点,但是经过三角化成功的三维点并不一定是有效的,需要筛选才能作为初始化地图点。 …...
leetcode 2239. 找到最接近 0 的数字
题目:2239. 找到最接近 0 的数字 - 力扣(LeetCode) 加班用手机刷水题,补个记录 1 class Solution { public:int findClosestNumber(vector<int>& nums) {int ret nums[0];for (int i 1; i < nums.size(); i) {if…...
Rust实现内网穿透工具:从原理到实现
目录 1.前言2.内网穿透原理3.丐版实现3.1 share3.2 server3.3 client3.4 测试4.项目优化4.1 工作空间4.2 代码合并4.3 无锁优化4.4 数据分离4.5 错误处理4.6 测试代码4.7 参数解析本篇原文为:Rust实现内网穿透工具:从原理到实现 更多C++进阶、rust、python、逆向等等教程,可…...
【深度学习】1.深度学习解决问题与应用领域
深度学习要解决的问题 一、图像识别相关问题 物体识别 背景和意义:在众多的图像中识别出特定的物体,例如在安防监控领域,识别出画面中的人物、车辆等物体类别。在自动驾驶技术中,车辆需要识别出道路上的行人、交通标志、其他车辆…...
文档解析:PDF里的复杂表格、少线表格如何还原?
PDF中的复杂表格或少线表格还原通常需要借助专业的工具或在线服务,以下是一些可行的方法: 方法一:使用在线PDF转换工具 方法二:使用桌面PDF编辑软件 方法三:通过OCR技术提取表格 方法四:手动重建表格 …...
深圳大学-计算机系统(3)-实验三取指和指令译码设计
实验目标 设计完成一个连续取指令并进行指令译码的电路,从而掌握设计简单数据通路的基本方法。 实验内容 本实验分成三周(三次)完成:1)首先完成一个译码器(30分);2)接…...
Java Swing 编程全面解析:从 AWT 到 Swing 的进化之路
目录 前言 一、AWT 简介 1. 什么是 AWT? 2. AWT 的基本组件 3. AWT 编程示例 二、Swing 的诞生与进化 1. Swing 的特点 2. Swing 和 AWT 的主要区别 3. Swing 的基本组件 三、Swing 编程的基础示例 四、Swing 的高级功能 1. 布局管理器 2. 事件监听 3…...
mysql数据库启动出现Plugin ‘FEEDBACK‘ is disabled.问题解决记录
本人出现该问题的环境是xampp,异常关机,再次在xampp控制面板启动mysql出现该问题。出现问题折腾数据库之前,先备份数据,将mysql目录下的data拷贝到其他地方,这很重要。 然后开始折腾。 查资料,会发现很多…...
2025年大模型对智能硬件发展的助力与创新创意
随着人工智能(AI)技术,尤其是大模型的快速进步,智能硬件领域正在经历前所未有的变革。到2025年,大模型不仅能为智能硬件提供强大的算法支持,还能通过数据处理、智能决策和系统集成等方面的创新,推动硬件设备的性能提升和功能拓展。本文将从多个维度分析大模型对智能硬件…...
Tensor 基本操作1 unsqueeze, squeeze, softmax | PyTorch 深度学习实战
本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 目录 创建 Tensor常用操作unsqueezesqueezeSoftmax代码1代码2代码3 argmaxitem 创建 Tensor 使用 Torch 接口创建 Tensor import torch参考:https://pytorch.org/tutorials/beginn…...
Python - itertools- pairwise函数的详解
前言: 最近在leetcode刷题时用到了重叠对pairwise,这里就讲解一下迭代工具函数pairwise,既介绍给大家,同时也提醒一下自己,这个pairwise其实在刷题中十分有用,相信能帮助到你。 参考官方讲解:itertools --- 为高效循…...
显卡驱动清理完全指南:从问题诊断到自动化解决方案
显卡驱动清理完全指南:从问题诊断到自动化解决方案 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers-uninstaller …...
降低OpenClaw Token消耗的三大实战策略,省钱后随便花,再也不用担心不够了
让AI“跑得更快、花得更少”:OpenClaw降本增效的终极实战手册 想象一下,你雇佣了一位才华横溢、但收费高昂的顶尖顾问。每次咨询,你都不厌其烦地把过去一整年的会议记录、所有项目文档、甚至茶水间的闲聊纪要都一股脑儿塞给他,然…...
大模型剪枝新范式:先浓缩,再剪枝——DenoiseRotator技术解读
在技术领域,我们常常被那些闪耀的、可见的成果所吸引。今天,这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力,让我们得以一窥未来的轮廓。然而,作为在企业一线构建、部署和维护复杂系统的实践者,我们深知…...
3步掌握猫抓扩展:网页资源嗅探工具全面使用指南
3步掌握猫抓扩展:网页资源嗅探工具全面使用指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 还在为在线视频无法保存而困扰吗&#…...
Janus-Pro-7B网络问题排查:遇到403 Forbidden等错误如何解决
Janus-Pro-7B网络问题排查:遇到403 Forbidden等错误如何解决 部署好Janus-Pro-7B服务,满心欢喜地准备调用时,屏幕上却弹出一个冷冰冰的“403 Forbidden”,或者连接超时、证书错误……这种瞬间从云端跌入谷底的感觉,相…...
Janus-Pro-7B文生图作品展:中国风角色、科幻机甲、自然生态高清图集
Janus-Pro-7B文生图作品展:中国风角色、科幻机甲、自然生态高清图集 1. 模型能力概览 Janus-Pro-7B是DeepSeek推出的统一多模态模型,它在一个框架内同时实现了图像理解和文本生成图像两大核心功能。这个设计思路很巧妙——传统上,理解图像和…...
打卡信奥刷题(3057)用C++实现信奥题 P6786 「SWTR-6」GCD LCM
P6786 「SWTR-6」GCD & LCM 题目描述 小 A 有一个长度为 nnn 的序列 a1,a2,⋯,ana_1,a_2,\cdots,a_na1,a2,⋯,an。 他想从这些数中选出一些数 b1,b2,⋯,bkb_1,b_2,\cdots,b_kb1,b2,⋯,bk 满足:对于所有 i(1≤i≤k)i\ (1\leq i\leq k)i (1≤i≤k)…...
Pixel Dream Workshop 面试宝典:常见Java面试题在AI项目中的实践
Pixel Dream Workshop 面试宝典:常见Java面试题在AI项目中的实践 1. 引言:当Java面试题遇上AI项目 最近在面试Java工程师时发现一个有趣现象:很多候选人能背出各种面试题的标准答案,但一旦问到"这个技术点在实际项目中怎么…...
Kook Zimage真实幻想Turbo企业级应用:SpringBoot微服务架构实战
Kook Zimage真实幻想Turbo企业级应用:SpringBoot微服务架构实战 1. 微服务架构下的AI图像生成价值 在内容创作平台的后台重构过程中,我们将Kook Zimage真实幻想Turbo的AI图像生成能力独立封装为微服务,这种架构设计带来了显著优势ÿ…...
DeepSeek-OCR-2实战:精准提取合同条款,自动生成结构化法律文书
DeepSeek-OCR-2实战:精准提取合同条款,自动生成结构化法律文书 1. 法律文书处理的痛点与解决方案 法律从业者每天都要处理大量合同、协议、判决书等文书材料。这些文档往往存在以下典型问题: 格式混乱:扫描件倾斜、模糊、双栏排…...
