[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.rhkb.cn/news/4360.html

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

相关文章

AIGC视频生成模型:Meta的Emu Video模型

大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本文详细介绍Meta的视频生成模型Emu Video,作为Meta发布的第二款视频生成模型,在视频生成领域发挥关键作用。 🌺优质专栏回顾&am…

IO进程----进程

进程 什么是进程 进程和程序的区别 概念: 程序:编译好的可执行文件 存放在磁盘上的指令和数据的有序集合(文件) 程序是静态的,没有任何执行的概念 进程:一个独立的可调度的任务 执行一个程序分配资…

flutter 使用google_mlkit_image_labeling做图片识别

在AI横行的如今,相信大家或多或少都做过跟AI接轨的需求了吧?今天我说的是关于图片识别的需求,flutter的专属图片识别插件google_mlkit_image_labeling。 google_mlkit_image_labeling它是Google旗下的Google Cloud Vision API中分支出来的一部…

elasticsearch基础

分布式搜索引擎01 1. 初始elasticsearch 1.1. 了解ES 1.1.1. elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容 例如: 在github搜索代码: 在电…

SQL Server查询计划操作符——查询计划相关操作符(4)

7.3. 查询计划相关操作符 28)Declare:该操作符在查询计划中分配一个本地变量。该操作符是一个语言元素。该操作符具体如图7.2-28所示。 图 7.2-28 查询计划操作符Declare示例 29)Delete:该操作符从一个对象中删除满足其参数列中可选谓词的数据行。该操作符具体如图7.2-29…

C++的auto_ptr智能指针:从诞生到被弃用的历程

C作为一种功能强大的编程语言,为开发者提供了众多便捷的特性和工具,其中智能指针是其重要特性之一。智能指针能够自动管理内存,有效避免内存泄漏等常见问题。然而,并非所有智能指针都尽善尽美,auto_ptr便是其中的一个例…

[手机Linux] 七,NextCloud优化设置

安装完成后在个人设置里发现很多警告,一一消除。 只能一条一条解决了。 关于您的设置有一些错误。 1,PHP 内存限制低于建议值 512 MB。 设置php配置文件: /usr/local/php/etc/php.ini 把里面的: memory_limit 128M 根据你自…

微软宣布Win11 24H2进入新阶段!设备将自动下载更新

快科技1月19日消息,微软于1月16日更新了支持文档,宣布Windows 11 24H2进入新阶段。 24H2更新于2024年10月1日发布,此前为可选升级,如今微软开始在兼容的Windows 11设备上自动下载并安装24H2版本。 微软表示:“运行Wi…

ddl-auto: create

package com.test.entity;import jakarta.persistence.*; import lombok.*; import org.hibernate.annotations.Comment;import java.time.Instant; import java.util.Objects;Comment("操作日志表") Entity // Entity注解的类将会初始化为一张数据库表 Table(name …

循环队列(C语言)

从今天开始我会开启一个专栏leetcode每日一题,大家互相交流代码经验,也当作我每天练习的自我回顾。第一天的内容是leetcode622.设计循环队列。 一、题目详细 设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO&#…

Golang Gin系列-1:Gin 框架总体概述

本文介绍了Gin框架,探索了它的关键特性,并建立了简单入门的应用程序。在这系列教程里,我们会探索Gin的主要特性,如路由、中间件、数据库集成等,最终能使用Gin框架构建健壮的web应用程序。 总体概述 Gin是Go编程语言的…

在线宠物用品|基于vue的在线宠物用品交易网站(源码+数据库+文档)

|在线宠物用品交易网站 目录 基于springbootvue的在线宠物用品交易网站 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|毕设布道师&am…

鸿蒙安装HAP时提示“code:9568344 error: install parse profile prop check error” 问题现象

在启动调试或运行应用/服务时,安装HAP出现错误,提示“error: install parse profile prop check error”错误信息。 解决措施 该问题可能是由于应用使用了应用特权,但应用的签名文件发生变化后未将新的签名指纹重新配置到设备的特权管控白名…

图像去雾数据集的下载和预处理操作

前言 目前,因为要做对比实验,收集了一下去雾数据集,并且建立了一个数据集的预处理工程。 这是以前我写的一个小仓库,我决定还是把它用起来,下面将展示下载的路径和数据处理的方法。 下面的代码均可以在此找到。Auo…

React的应用级框架推荐——Next、Modern、Blitz等,快速搭建React项目

在 React 企业级应用开发中,Next.js、Modern.js 和 Blitz 是三个常见的框架,它们提供了不同的特性和功能,旨在简化开发流程并提高应用的性能和扩展性。以下是它们的详解与比较: Next、Modern、Blitz 1. Next.js Next.js 是由 Ve…

内网渗透测试工具及渗透测试安全审计方法总结

1. 内网安全检查/渗透介绍 1.1 攻击思路 有2种思路: 攻击外网服务器,获取外网服务器的权限,接着利用入侵成功的外网服务器作为跳板,攻击内网其他服务器,最后获得敏感数据,并将数据传递到攻击者&#xff0…

Weblogic - General - 弱口令 任意文件读取漏洞

0x01:漏洞简介 首先需要说明,本文并不是介绍了 Weblogic 某一 CVE 漏洞,而是提供了一种通用的测试思路。 0x0101:弱口令漏洞 弱口令漏洞主要是由于用户安全意识淡薄,为了便于记忆,设置了强度过低的密码&…

重温STM32之环境安装

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

Ceph与RAID在存储中的协同工作过程

本文将结合架构图,详细讲解Ceph与RAID如何在存储环境中相互配合,共同提供高效且可靠的存储服务。 架构概述 从上图中可以看到,Ceph的架构主要分为四个层次: 客户端和服务接口层:这一层包括客户端访问存储应用的接口…

蓝桥杯训练—矩形面积交

文章目录 一、题目二、示例三、解析四、代码 一、题目 平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴,对于每个矩形,我们给出它的一对相对顶点的坐标,请你编程写出两个矩形的交的面积 输入格式: 输入包含两行…