• Python 3.x--Socket实现简单的ssh和文件下载功能


    *****************SSH*********************

    ---------------服务器端----------------

     1 import os,socket
     2 
     3 server = socket.socket()
     4 server.bind(('127.0.0.1',6666))
     5 server.listen()
     6 
     7 while True:
     8     conn, addr = server.accept()
     9     print("new addr:",addr)
    10     while True:
    11         data = conn.recv(1024)
    12         if not data:
    13             print("客户端已断开。。。")
    14             break
    15         print("执行指令。。。",data)
    16         res = os.popen(data.decode()).read()   #接受命令,并返回结果
    17         if len(res)==0:
    18             res = "cmd has no output..."
    19         conn.send(str(len(res.encode('utf-8'))).encode('utf-8'))               #发送输出结果的大小
    20         sleep_recv = conn.recv(1024)
    21         print("缓冲...",sleep_recv.decode())    #两条send命令可能会出现粘包的情况
    22         conn.send(res.encode('utf-8'))
    23 
    24 server.close()

    ---------------客户端----------------

     1 import socket
     2 
     3 client = socket.socket()
     4 client.connect(('127.0.0.1',6666))
     5 
     6 while True:
     7     cmd = input(">>>:").strip()
     8     if len(cmd)==0:
     9         continue
    10     client.send(cmd.encode('utf-8'))   #发送命令
    11     res_size = client.recv(1024)          #接收第一个结果:字节长度
    12     print("命令结果大小:",res_size)
    13     client.send("已准备好接收命令结果。。。".encode("utf-8"))
    14     res_size_init = 0
    15     res_data = b''
    16     while res_size_init != int(res_size.decode()):
    17         data = client.recv(1024)   #不一定能接收到正好1024字节的数据
    18         print(len(data))
    19         res_size_init += len(data)
    20         res_data += data
    21     else:
    22         print("res_data receive done...",res_size_init)
    23         print(res_data.decode())
    24 
    25 client.close()

    运行结果:

     ---------------服务器端----------------

     ---------------客户端----------------

     *****************文件下载*********************

    ---------------服务器端----------------

    import os,socket,hashlib
    
    server = socket.socket()
    server.bind(('localhost',6666))
    server.listen()
    
    while True:
        conn, addr = server.accept()
        print("new addr:",addr)
        while True:
            data = conn.recv(1024)
            if not data:
                print("客户端已断开。。。")
                break
            cmd, filename = data.decode().split()
            print(filename)
            if os.path.isfile(filename):
                f = open(filename,"rb")
                m = hashlib.md5()
                file_size = os.stat(filename).st_size
                conn.send(str(file_size).encode("utf-8"))   #发送文件大小
                conn.recv(1024)   #等待回复
                for line in f:
                    m.update(line)
                    conn.send(line)
                print("file md5:",m.hexdigest())
                f.close()
                conn.send(m.hexdigest().encode("utf-8"))   #发送MD5,与上面的“conn.send(line)”可能出现粘包
            print("send done...")
    
    server.close()

    ---------------客户端----------------

    import socket,hashlib
    
    client = socket.socket()
    client.connect(('localhost', 6666))
    
    while True:
        cmd = input(">>>:").strip()
        if len(cmd)==0:
            continue
        if cmd.startswith("get"):
            filename = cmd.split()[1]   #获取文件名
            client.send(cmd.encode("utf-8"))
            server_resp_size = client.recv(1024)   #接收文件总的大小
            file_total_size = int(server_resp_size.decode())
            print("file size:", server_resp_size)
            client.send(b"ready to recv file...")
            f = open(filename+".new","wb")
            recv_size = 0
            m = hashlib.md5()
            while recv_size < file_total_size:
                if file_total_size - recv_size > 1024:   #判断最后一次,之前接收大小设置为1024
                    size = 1024
                else:                                    #最后一次不足1024,则只接收文件剩余的部分,不包含MD5
                    size = file_total_size - recv_size
                    print("the last size:",size)
                data = client.recv(size)
                recv_size += len(data)
                f.write(data)
                m.update(data)
            else:
                client_md5 = m.hexdigest()
                print("recv done...")
                print("total size:", file_total_size, "had been received:", recv_size)
                server_md5 = client.recv(1024)
                print("server md5:", client_md5, "server md5:", server_md5.decode())
                f.close()
    
    client.close()

    运行结果:

  • 相关阅读:
    openssl 自己制作ssl证书:自己签发免费ssl证书,为nginx生成自签名ssl证书
    【nginx】一台nginx服务器多域名配置
    使用 Microsoft.Web.Administration 管理iis
    Android TextView : “Do not concatenate text displayed with setText”
    Android中将十六进制 颜色代码 转换为int类型数值
    android-getTextSize返回值是以像素(px)为单位的,setTextSize()以sp为单位
    Android属性allowBackup安全风险浅析
    Android 如何保持屏幕常亮
    Android 控制ScrollView滚动到底部
    Android 自定义TextView 实现文本间距
  • 原文地址:https://www.cnblogs.com/rainowl-ymj/p/7221668.html
Copyright © 2020-2023  润新知