[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显示为固定保留两位小数 '''''''''''''''''''''''''''''' ...
随机推荐
- 关于OELD屏显示电池电量的简易方法
如何采集电源电压大家可能都熟悉,stm32的ADC+DMA能很方便迅速的帮我们采集到自己想要的电压数据.使用DMA进行数据搬运也能很好的减轻CPU的一部分压力.但是这样只是第一步--数据. 用户想看到 ...
- PHP pathinfo() 函数
PHP pathinfo() 函数 完整的 PHP Filesystem 参考手册 定义和用法 pathinfo() 函数以数组或字符串的形式返回关于文件路径的信息. 返回的数组元素如下: [dirn ...
- dede添加会员功能听语音
http://jingyan.baidu.com/article/363872ec36d33f6e4ba16fb7.html 其实 dede里面的 会员功能就是圈子模版啦 圈子 安装了 基本上有 1, ...
- JVM核心之JVM运行和类加载全过程
为什么研究类加载全过程? 有助于连接JVM运行过程 更深入了解java动态性(解热部署,动态加载),提高程序的灵活性 类加载机制 JVM把class文件加载到内存,并对数据进行校验.解析和初始化,最终 ...
- salesforce零基础学习(八十五)streaming api 简单使用(接近实时获取你需要跟踪的数据的更新消息状态)
Streaming API参考链接: https://trailhead.salesforce.com/en/modules/api_basics/units/api_basics_streaming ...
- Spring MVC 用post方式提交表单到Controller乱码问题,而get方式提交没有乱码问题
在web.xml中添加一个filter,即可解决post提交到Spring MVC乱码问题 <!-- 配置请求过滤器,编码格式设为UTF-8,避免中文乱码--> <filter> ...
- Maven1-HelloWorld简单入门
编写POM(Project Object Model) Maven项目的核心是pom.xml,它定义了项目的基本信息,用于描述项目如何构建,声明项目依赖 创建文件夹,名称为hello-world 创建 ...
- 使用logrotate分割tomcat日志
转:https://www.52os.net/articles/using-logrotate-manage-tomcat-logs.html July 28, 2014 日志是Linux系统中最重要 ...
- android软键盘的显示和隐藏
显示: InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); imm.toggle ...
- 【转】GPS网平差
进行GPS网平差的目的主要有三个: (1)消除由观测量和已知条件中存在的误差所引起的GPS网在几何上的不一致.包括闭合环闭合差不为0:复测基线较差不为0:通过由基线向量所形成的导线,将坐标由一个已知点 ...