服务器端:

流程:

  1.创建servert实例

  2.绑定地址和端口

  3.开始监听

  4.创建客户端连接实例

  5.等待客户端的消息

  6..........

 # The_author = 'liu66'
# By python3.x
# -*- coding = utf-8 -*- import socket,os server=socket.socket()
server.bind(("localhost",66))#绑定要监听的端口
server.listen(5)#开始监听
# 等电话打进来 while True:
print("我要开始等电话了")
conn,addr=server.accept()#conn为连接的实例
print("实例的连接和地址分别为:",conn,addr)
while True:
print("等待数据接收...")
data=conn.recv(1024)
if not data:
print("client has closed...")
break
# print(data)
# print(data.decode())
# conn.send(data.upper())
# 执行cmd命令
try:
res = os.popen(data.decode()).read()
except TypeError:
print("请输入正确的CMD")
else:
print("------------------")
print(res)#打印返回的值
print("------------------")
'''一定要判断返回的长度'''
print(len(res))
received_size=''
if len(res) == 0:
res = "cmd is not correct..."
print(res)
conn.send(str(len(res.encode("utf-8"))).encode()) sleep_recv = conn.recv(1024)
print("缓冲...", sleep_recv.decode()) # 两条send命令可能会出现粘包的情况 conn.send(res.encode("utf-8")) print("server is closed...")
server.close()

ssh_server

客户端:

  1.创建client实例

  2.连接服务器,地址端口

  3.向服务器发送命令

  4............

 # The_author = 'liu66'
# By python3.x
# -*- coding = utf-8 -*- import socket client=socket.socket()
client.connect(("localhost",66)) while True:
send_data=input(">>:").strip()
if len(send_data) == 0: continue
client.send(send_data.encode("utf-8"))
# data=client.recv(1024)
# print("server接收到的数据:",data.decode()) ############ 数据初始化 ####################
data_size=0#要接受的数据大小
data_res=b''#要接受的数据的内容大小
received_size=0
received_data=b''#要接受的数据的内容
############################################
'''先接收要接受的数据大小'''
data_size=client.recv(1024)
print("要接受的数据大小:", data_size) '''发送缓冲数据'''
client.send("...".encode()) while received_size != int(data_size):
data_res=client.recv(1024)
received_size+=len(data_res)
received_data+=data_res
else:
print("已接收数据大小:",received_size)
print(received_data.decode("utf-8","ignore"))
'''decode()默认的参数就是strict,代表遇到非法字符时抛出异常;
如果设置为ignore,则会忽略非法字符;
如果设置为replace,则会用?号取代非法字符;
如果设置为xmlcharrefreplace,则使用XML的字符引用。''' # print(data_res.decode("utf-8","replace")) print("client is closed...")
client.close()

ssh_client

问题总结:

  1. 绑定地址和端口时,需要合并为一个参数
client.connect(("localhost",66))

  2.  发送cmd时,判断发送的字符串不能为空

send_data=input(">>:").strip()
if len(send_data) == 0: continue

  3.  发送数据需要进行编码encode

client.send(send_data.encode("utf-8"))

  4.  先发送需要的字符长度,再接收一个缓冲消息,最后再发送内容,防止两次连续发送的粘包

 conn.send(str(len(res.encode("utf-8"))).encode())
sleep_recv = conn.recv(1024)
print("缓冲...", sleep_recv.decode()) # 两条send命令可能会出现粘包的情况 conn.send(res.encode("utf-8"))

  5.  执行命令异常处理

        try:
res = os.popen(data.decode()).read()
except TypeError:
print("请输入正确的CMD")
else:
print("------------------")
print(res)#打印返回的值
print("------------------")

  6.  发送ls命令不报error,返回为空,判断返回是否为空

            print(len(res))
received_size=''
if len(res) == 0:
res = "cmd is not correct..."

  7.  对于数据超过1024时处理,判断每次接受的字节长度,累加,直到长度等于发送的总长度

    while received_size != int(data_size):
data_res=client.recv(1024)
received_size+=len(data_res)
received_data+=data_res

  8.  print(xx.decode())经常出现非法字符异常的解决办法

        print(received_data.decode("utf-8","ignore"))
'''decode()默认的参数就是strict,代表遇到非法字符时抛出异常;
如果设置为ignore,则会忽略非法字符;
如果设置为replace,则会用?号取代非法字符;
如果设置为xmlcharrefreplace,则使用XML的字符引用。'''

[Python Study Notes]Socket模拟ssh执行cmd并记录遇到的问题的更多相关文章

  1. Socket模拟SSH

    Socket模拟SSH 主要思路 客户端发送相关命令到服务端,服务端执行命令(通过subprocess模块实现)然后将结果返回给客户端 小知识 Linux中可以发送空数据,服务端能接受到空数据 win ...

  2. Python之路 - Socket实现远程执行命令

    Python之路 - Socket实现远程执行命令 os模块实现

  3. Python 简单socket模拟ssh

    OSI七层模型(Open System Interconnection,开放式系统互联) 应用层 表示层 回话层 传输层 tcp,udp 网络层 ip,icmp 数据链路层 mac地址 物理层 物理网 ...

  4. [Python 网络编程] TCP、简单socket模拟ssh (一)

    OSI七层模型(Open System Interconnection,开放式系统互联) 应用层 网络进程访问应用层: 为应用程序进程(例如:电子邮件.文件传输和终端仿真)提供网络服务: 提供用户身份 ...

  5. [Python Study Notes]异常处理

    正则表达式 python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误.你可以使用该功能来调试python程序. 异常处理 断言(Assertions) python标准异常 ...

  6. [Python Study Notes]with的使用

    在 Python 2.5 中, with 关键字被加入.它将常用的 try ... except ... finally ... 模式很方便的被复用.看一个最经典的例子: with open('fil ...

  7. [Python Study Notes]CS架构远程访问获取信息--SERVER端v2.0

    更新内容: 1.增加内存信息获取 2.增加电池信息获取 3.增加磁盘信息获取 4.重新布局窗体 5.增加窗体名称 6.增加连接成功之前,不可按压 ''''''''''''''''''''''''''' ...

  8. [Python Study Notes]CS架构远程访问获取信息--Client端v2.0

    更新内容: 1.增加内存信息获取 2.增加电池信息获取 3.增加磁盘信息获取 4.重新布局窗体 5.增加窗体名称 6.增加连接成功之前,不可按压 效果图: '''''''''''''''''''''' ...

  9. [Python Study Notes]CS架构远程访问获取信息--Client端v1.0

    更新内容: 1.添加entry栏默认ip和port口 2.修正退出功能 3.添加退出自动关闭窗口功能 4.优化cpu显示为固定保留两位小数 '''''''''''''''''''''''''''''' ...

随机推荐

  1. Navicat连接阿里云Mysql遇到的的坑

    连上去那一刻,心态真是起飞了

  2. zoom:1是什么意思

    当一个容器内元素都浮动后,它将高度将不会随着内部元素高度的增加而增加,所以造成内容元素的显示超出了容器. overflow:auto;是让高度自适应, zoom:1;是为了兼容IE6,也可以用heig ...

  3. 宝塔linux面板.txt

    安装命令: yum -y install screen wget && screen -S bt wget -O install.sh http://103.224.251.79:58 ...

  4. vue-cli的webpack模版项目配置解析-build/dev-server.js

    我们在使用vue-cli搭建vuejs项目(Vuejs实例-01使用vue-cli脚手架搭建Vue.js项目)的时候,会自动生成一系列文件,其中就包含webpack配置文件.我们现在来看下,这些配置到 ...

  5. C#编写影院售票系统(A project with a higher amount of gold )(2:相关代码)

    此篇文章为项目代码,,,需要项目需求 ,思路分析与窗体效果请访问:http://www.cnblogs.com/lsy131479/p/8367304.html 项目类图: 影院类: using Sy ...

  6. Linkin大话Java和internet概念

    整理电脑,无意中翻到不知道哪里来的文章,觉得里面写的很好,仔细看过一遍后,整理了下贴了出来,其中的好多概念我觉得讲的很透彻. 既然Java不过另一种类型的程序设计语言,为什么还有这么多的人认为它是计算 ...

  7. MySQL中时间函数NOW()和SYSDATE()的区别

    mysql中日期函数还是比较常用的.主要有NOW()和SYSDATE()两种,虽然都表示当前时间,但使用上有一点点区别. NOW()取的是语句开始执行的时间,SYSDATE()取的是动态的实时时间. ...

  8. vmware虚拟机无法连接网络

    这是一个老生常谈的问题,而且网上有一套解决方法,最方便快捷的肯定属恢复虚拟网络了 说说我的情况 虚拟机VMware® Workstation 12 Pro centos6.8,克隆,192.168.2 ...

  9. linux socket 编程(C语言)[转]

    最近看了一些网络编程的书籍,一直以来总感觉网络编程神秘莫测,其实网络编程入门还是很容易学的,下面这些代码是我在linux下编写的,已经运行过了,编译之后就可以运行了.有不足之处希望大家多多指出,共同学 ...

  10. webpack最简示例

    安装webapck webpack依赖node环境,所以在此之前要保证系统中有node环境. 打开cmd控制台 $ npm install webpack -g 全局安装webpack 配置模块 we ...