Python 3.x--Socket實現簡單的ssh和文件下載功能

*****************SSH*********************服務器

---------------服務器端----------------socket

 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()

 

---------------客戶端----------------spa

 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()

 

運行結果:code

 ---------------服務器端----------------server

 

 ---------------客戶端----------------blog

 

 *****************文件下載*********************ip

 

---------------服務器端----------------md5

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()

 

---------------客戶端----------------utf-8

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()

 

運行結果:get

相關文章
相關標籤/搜索