服务器端:

流程:

  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. 一个简洁的PHP可逆加密函数(分享)

    http://www.jb51.net/article/38018.htm 本篇文章是对一个简洁的PHP可逆加密函数进行了详细的分析介绍,需要的朋友参考下   很多时候我们需要对数据进行加密解密,比如 ...

  2. 邓_php面试【002】——完整版

    1.用PHP打印出前一天的时间格式是2006-5-10 22:21:21(2分) $a = date("Y-m-d H:i:s", strtotime("-1 day&q ...

  3. IDEA、Matlab 注释

    IDEA ctrl+/ 多行代码分行注释,再按一次取消 ctrl+shift+/ 多行代码注释在一个块里,只在开头和结尾有注释符号 Matlab 注释:Ctrl+/ Ctrl+R 取消注释:Ctrl+ ...

  4. oracle11g安装教程(注意事项及图文教程)

    Oracle安装与重装注意事项 1.安装oracle(**) 注意:安装Oracle之前确定自己的主机(计算机)名要保证计算机名是英文的. 1.oracle的安装文件不要放在含有中文的目录当中,如:d ...

  5. Insert Sort Singly List

    对单链表插入排序,给出个单链表的head节点:返回排完序的head节点: 首先数据结构中习惯了以数组为参数排序,瞬间想到是遍历单链表存入arraylist中,再进行insert sort,(O(n** ...

  6. Build path contains duplicate entry

    问题:Build path contains duplicate entry:''D:soft/Myeclipse 6.5/jre/lib/rt.jar' for project 'dataServi ...

  7. 03 整合IDEA+Maven+SSM框架的高并发的商品秒杀项目之web层

    Github:https://github.com/nnngu 项目源代码:https://github.com/nnngu/nguSeckill 前端交互流程设计 对于一个系统,需要产品经理.前端工 ...

  8. 频繁更换ip会影响SEO优化吗?

    网站更换ip会不影响SEO的效果,其实网站更换ip是正常的(但不能频繁更换),搜索引擎抓取是根据网站的域名进行的,不是根据ip来抓取你的网站.在短时间内更换IP对SEO的效果并没有很大的影响. 如果是 ...

  9. Android_基础控件

    目录 一.文本控件TextView 二.按钮控件Button 三.图片控件ImageView 四.输入控件EditText 一.文本控件TextView 1.布局文件 <TextView and ...

  10. Intellij-工程目录下隐藏不想显示的文件和文件夹

    File-->Editor-->File Types