[Python Study Notes] Socket模拟ssh并记录遇到的问题

服务器端:

流程:

  1.创建servert实例

  2.绑定地址和端口

  3.开始监听

  4.创建客户端连接实例

  5.等待客户端的消息

  6..........

 1 # The_author = ‘liu66‘
 2 # By python3.x
 3 # -*- coding = utf-8 -*-
 4
 5
 6 import socket,os
 7
 8 server=socket.socket()
 9 server.bind(("localhost",66))#绑定要监听的端口
10 server.listen(5)#开始监听
11 # 等电话打进来
12
13 while True:
14     print("我要开始等电话了")
15     conn,addr=server.accept()#conn为连接的实例
16     print("实例的连接和地址分别为:",conn,addr)
17     while True:
18         print("等待数据接收...")
19         data=conn.recv(1024)
20         if not data:
21             print("client has closed...")
22             break
23         # print(data)
24         # print(data.decode())
25         # conn.send(data.upper())
26         # 执行cmd命令
27         try:
28             res = os.popen(data.decode()).read()
29         except TypeError:
30             print("请输入正确的CMD")
31         else:
32             print("------------------")
33             print(res)#打印返回的值
34             print("------------------")
35             ‘‘‘一定要判断返回的长度‘‘‘
36             print(len(res))
37             received_size=‘‘
38             if len(res) == 0:
39                 res = "cmd is not correct..."
40             print(res)
41             conn.send(str(len(res.encode("utf-8"))).encode())
42
43             sleep_recv = conn.recv(1024)
44             print("缓冲...", sleep_recv.decode())  # 两条send命令可能会出现粘包的情况
45
46             conn.send(res.encode("utf-8"))
47
48
49
50
51
52
53 print("server is closed...")
54 server.close()

ssh_server

客户端:

  1.创建client实例

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

  3.向服务器发送命令

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

 1 # The_author = ‘liu66‘
 2 # By python3.x
 3 # -*- coding = utf-8 -*-
 4
 5
 6 import socket
 7
 8 client=socket.socket()
 9 client.connect(("localhost",66))
10
11 while True:
12     send_data=input(">>:").strip()
13     if len(send_data) == 0: continue
14     client.send(send_data.encode("utf-8"))
15     # data=client.recv(1024)
16     # print("server接收到的数据:",data.decode())
17
18     ############   数据初始化 ####################
19     data_size=0#要接受的数据大小
20     data_res=b‘‘#要接受的数据的内容大小
21     received_size=0
22     received_data=b‘‘#要接受的数据的内容
23     ############################################
24     ‘‘‘先接收要接受的数据大小‘‘‘
25     data_size=client.recv(1024)
26     print("要接受的数据大小:", data_size)
27
28     ‘‘‘发送缓冲数据‘‘‘
29     client.send("...".encode())
30
31     while received_size != int(data_size):
32         data_res=client.recv(1024)
33         received_size+=len(data_res)
34         received_data+=data_res
35     else:
36         print("已接收数据大小:",received_size)
37         print(received_data.decode("utf-8","ignore"))
38         ‘‘‘decode()默认的参数就是strict,代表遇到非法字符时抛出异常;
39            如果设置为ignore,则会忽略非法字符;
40            如果设置为replace,则会用?号取代非法字符;
41            如果设置为xmlcharrefreplace,则使用XML的字符引用。‘‘‘
42
43     # print(data_res.decode("utf-8","replace"))
44
45
46 print("client is closed...")
47 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的字符引用。‘‘‘

原文地址:https://www.cnblogs.com/liu66blog/p/8284122.html

时间: 2024-10-17 11:38:12

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

Python 简单socket模拟ssh

OSI七层模型(Open System Interconnection,开放式系统互联) 应用层 网络进程访问应用层: 为应用程序进程(例如:电子邮件.文件传输和终端仿真)提供网络服务: 提供用户身份验证 表示层 数据表示: 确保接收系统可以读出该数据: 格式化数据: 构建数据: 协商用于应用层的数据传输语法: 提供加密 回话层 主机间通信: 建立.管理和终止在应用程序之间的会话 传输层 传输问题: 确保数据传输的可靠性: 建立.维护和终止虚拟电路: 通过错误检测和恢复: 信息流控制来保证可靠性

【学习笔记】Python网络编程(三)利用socket模拟ssh协议

上代码,server端: import socket,os s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) host = '' port = 1051 s.bind((host,port)) s.listen(4) while 1:     conn,addr = s.accept()     while 1:         data = conn.recv(1024)         if not data:break        

【学习笔记】Python网络编程(四)完善socket模拟ssh协议

server端代码: import socket,commands host =  '' port = 1053 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.bind((host,port)) s.listen(1) while 1:     conn,addr = s.accept()     while 1:         data = conn.recv(1024)         cc,bb = commands.get

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

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' >>文件: ps_client.py >>作者: liu yang >>邮箱: [email protected] '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

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

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' >>文件: ps_server.py >>作者: liu yang >>邮箱: [email protected] '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

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

更新内容: 1.添加entry栏默认ip和port口 2.修正退出功能 3.添加退出自动关闭窗口功能 4.优化cpu显示为固定保留两位小数 ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' >>文件: ps_client.py >>作者: liu yang >>邮箱: [email protected] '''''''''

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

更新内容: 1.增加内存信息获取 2.增加电池信息获取 3.增加磁盘信息获取 4.重新布局窗体 5.增加窗体名称 6.增加连接成功之前,不可按压 ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' >>文件: ps_server.py >>作者: liu yang >>邮箱: [email protected] >&g

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

更新内容: 1.增加内存信息获取 2.增加电池信息获取 3.增加磁盘信息获取 4.重新布局窗体 5.增加窗体名称 6.增加连接成功之前,不可按压 效果图: ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' >>文件: ps_client.py >>作者: liu yang >>邮箱: [email protected] &

[Python Study Notes]正则表达式

正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式. re 模块使 Python 语言拥有全部的正则表达式功能. compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象.该对象拥有一系列方法用于正则表达式匹配和替换. re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数. 本章节主要介绍Python中常用