[Python Study Notes]Socket模拟ssh执行cmd并记录遇到的问题
服务器端:
流程:
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
问题总结:
- 绑定地址和端口时,需要合并为一个参数
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并记录遇到的问题的更多相关文章
- Socket模拟SSH
Socket模拟SSH 主要思路 客户端发送相关命令到服务端,服务端执行命令(通过subprocess模块实现)然后将结果返回给客户端 小知识 Linux中可以发送空数据,服务端能接受到空数据 win ...
- Python之路 - Socket实现远程执行命令
Python之路 - Socket实现远程执行命令 os模块实现
- Python 简单socket模拟ssh
OSI七层模型(Open System Interconnection,开放式系统互联) 应用层 表示层 回话层 传输层 tcp,udp 网络层 ip,icmp 数据链路层 mac地址 物理层 物理网 ...
- [Python 网络编程] TCP、简单socket模拟ssh (一)
OSI七层模型(Open System Interconnection,开放式系统互联) 应用层 网络进程访问应用层: 为应用程序进程(例如:电子邮件.文件传输和终端仿真)提供网络服务: 提供用户身份 ...
- [Python Study Notes]异常处理
正则表达式 python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误.你可以使用该功能来调试python程序. 异常处理 断言(Assertions) python标准异常 ...
- [Python Study Notes]with的使用
在 Python 2.5 中, with 关键字被加入.它将常用的 try ... except ... finally ... 模式很方便的被复用.看一个最经典的例子: with open('fil ...
- [Python Study Notes]CS架构远程访问获取信息--SERVER端v2.0
更新内容: 1.增加内存信息获取 2.增加电池信息获取 3.增加磁盘信息获取 4.重新布局窗体 5.增加窗体名称 6.增加连接成功之前,不可按压 ''''''''''''''''''''''''''' ...
- [Python Study Notes]CS架构远程访问获取信息--Client端v2.0
更新内容: 1.增加内存信息获取 2.增加电池信息获取 3.增加磁盘信息获取 4.重新布局窗体 5.增加窗体名称 6.增加连接成功之前,不可按压 效果图: '''''''''''''''''''''' ...
- [Python Study Notes]CS架构远程访问获取信息--Client端v1.0
更新内容: 1.添加entry栏默认ip和port口 2.修正退出功能 3.添加退出自动关闭窗口功能 4.优化cpu显示为固定保留两位小数 '''''''''''''''''''''''''''''' ...
随机推荐
- java如何获取一个对象的大小
When---什么时候需要知道对象的内存大小 在内存足够用的情况下我们是不需要考虑java中一个对象所占内存大小的.但当一个系统的内存有限,或者某块程序代码允许使用的内存大小有限制,又或者设计一个缓存 ...
- PHP批量去除bom头代码的小工具
在 aitecms 群里有网友抱怨了好几天说本地的验证码一直无法显示,后来听说解决了,问其如何解决的,说是去除了文件 bom 就好了.后来百度到一篇文章也说 dedecms 的验证码不能显示,某次解决 ...
- Redis单机版安装
1.工具简单介绍 1.博主使用的是Xshell工具 ps:需要设置端口和连接名称,端口一般默认为22,需要的童鞋可以自行百度 2.Redis单机版安装 第一步:安装gcc编译环境 yum instal ...
- @ property 与@ synthesize 的作用 VS @interface
表示声明了一个实例属性和它的getter和setter器 只在@interface中定义变量的话,你所定义的变量只能在当前的类中访问,在其他类中是访问不了的:而用@property声明的变量可以在外部 ...
- Java泛型范例
class Point<T>{ // 此处可以随便写标识符号,T是type的简称 private T var ; // var的类型由T指定,即:由外部指定 public T getVar ...
- mmap 测试的一些坑
最近遇到一个mmap的问题,然后为了测试该问题,写了如下测试代码: #include <sys/mman.h> #include <sys/stat.h> #include & ...
- scrapy_简介页面和详情页面
如何对提取的URL进行限定? 往上找id和class属性值,进行多次层级选择,进行内容限定 如何实现获取主页所有urls,然后交给scrapy下载后并解析详情页面,返回结果?(文章简介页面和文章详细页 ...
- Springboot中使用AOP统一处理Web请求日志
title: Springboot中使用AOP统一处理Web请求日志 date: 2017-04-26 16:30:48 tags: ['Spring Boot','AOP'] categories: ...
- 如何修改nexus的端口号
1. Maven仓库:放置所有JAR文件(WAR,ZIP,POM等等)的地方,所有Maven项目可以从同一个Maven仓库中获取自己所需要的依赖JAR,这节省了磁盘资源. 简言之,Maven仓库能帮助 ...
- MyEclipse中好用的快捷键汇总
MyEclipse中常用的快捷键有很多,合理的使用其中一些快捷键组合,可以有效提高开发的效率和质量. 1.Ctrl + Shift + R:打开资源.可以查找并打开工作区中任何一个文件,且支持使用通配 ...