江湖道

庙堂,江湖,学术!

返回顶部

socket网络编程ssh功能的简单实现与黏包处理

ssh的实现代码:https://github.com/anliu520/python-wheel/tree/master/socket%E2%80%94%E2%80%94%E5%8D%95%E7%BA%BF%E7%A8%8Bssh%E9%93%BE%E6%8E%A5%E7%AE%80%E5%8D%95%E5%8A%9F%E8%83%BD

黏包处理:

service端:

(test02) [root@server02 program]# cat my_ssh_service.py
#Author:Anliu
import socket,os,time
server = socket.socket()
server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)   #回收重用端口
#server.bind(("127.0.0.1",8888))
server.bind(("0.0.0.0",8888))
server.listen()
print("等待数据")
while True:
    conn,addr = server.accept()
    print("数据来了...")
    while True:
        try:
            data = conn.recv(1024)
            if not data:
                break
            reg = os.popen(data.decode("utf-8")).read()
            print(reg)
            if len(reg) == 0:
                reg = "输入内容为空"
            conn.send(str(len(reg.encode("utf-8"))).encode("utf-8"))
#            time.sleep(0.5)
            client_ack = conn.recv(1024)
            conn.send(reg.encode())
        except ConnectionResetError as key:
            break
#        conn.close()

client端:

#Author:Anliu

import socket
client = socket.socket()
#client.connect(("127.0.0.1",8888))
client.connect(("192.168.42.3",8888))
while True:
    mgs = input(">>>:").strip()
    if len(mgs) == 0: continue
    client.send(mgs.encode("utf-8"))
    data = client.recv(1024)
    client.send(b"ack")
    #print(data.decode("utf-8"))
    cmd_size = 0
    received_data = b""
    while cmd_size < int(data.decode("utf-8")):
        cmd_data = client.recv(1024)
        cmd_size += len(cmd_data)
        received_data += cmd_data
        #print(cmd_data.decode("utf-8"))
    else:
        #print("命令执行完毕...",cmd_size)
        print(received_data.decode())
posted @ 2020-06-10 16:41  大江东流水  阅读(209)  评论(0编辑  收藏  举报