ssh服務端 ssh客戶端 socket文件傳輸並校驗 服務端 socket文件傳輸並校驗 客戶端 ...
ssh服務端
import socket,os server = socket.socket() server.bind(('localhost',6666)) server.listen() conn, addr = server.accept() while True: print('等待新數據!') cmd = conn.recv(1024) if len(cmd) == 0: break data = os.popen(cmd.decode()).read() cmd_size = len(data.encode('utf-8')) print('檢測到數據大小',cmd_size) if len(data) == 0: data = '沒有此命令!!' conn.send(str(len(data.encode('utf-8'))).encode()) order = conn.recv(1024) conn.send(data.encode('utf-8')) print('傳送完成!') server.close()
ssh客戶端
import socket client = socket.socket() client.connect(('localhost',6666)) while True: cmd = input('>>>:') if cmd == 0: continue client.send(cmd.encode('utf-8')) cmd_size = client.recv(1024) print('服務端檢測到數據大小:', cmd_size) if len(cmd_size) !=0: client.send('可以發送數據了'.encode(encoding='utf-8')) receive_size = 0 receive_cmd = b'' while receive_size < int(cmd_size.decode()): data = client.recv(1024) receive_size += len(data) receive_cmd += data else: print('接收到數據大小:',receive_size) print('數據接收完成!') print(receive_cmd.decode())
socket文件傳輸並校驗
服務端
import socket,os,hashlib server = socket.socket() server.bind(('localhost',6666)) server.listen() conn, addr = server.accept() while True: print('等待新數據!') cmd = conn.recv(1024) if len(cmd) == 0: break filename = cmd.decode().split()[1] print(filename) if os.path.isfile(filename): #判斷文件是否存在 f = open(filename,'rb') #打開文件 m = hashlib.md5() file_size = os.stat(filename).st_size #查詢文件大小 print(file_size) conn.send(str(file_size).encode()) #給客戶端發送文件大小 conn.recv(1024) #等待並接受客戶端的確認,這一步可以解決粘包問題 for line in f: #邊讀邊迴圈發送文件 m.update(line) #得出每一句的md5值 conn.send(line) #發送給客戶端 print('file md5:',m.hexdigest()) f.close() conn.recv(1024) conn.send(m.hexdigest().encode()) print('傳送完成!') server.close()
socket文件傳輸並校驗
客戶端
import socket,hashlib client = socket.socket() client.connect(('localhost',6666)) while True: cmd = input('>>>:').strip() if len(cmd) == 0: continue if cmd.startswith('get'): #傳輸文件名要以get開頭如:get var client.send(cmd.encode('utf-8')) file_size = client.recv(1024) print('服務端檢測到文件大小:', int(file_size)) client.send('可以發送數據了'.encode(encoding='utf-8')) file_total_size = int(file_size) receive_size = 0 filename = cmd.split()[1] #以空格分割然後取出文件名 f = open('new_'+filename ,'wb') m = hashlib.md5() while receive_size < file_total_size: data = client.recv(1024) m.update(data) receive_size += len(data) f.write(data) print(file_total_size, receive_size) else: new_file_md5 = m.hexdigest() print('數據接收完成!') f.close() client.send('可以發送md5值了'.encode()) serve_md5 = client.recv(1024) print('新文件md5:',new_file_md5) print('原文件md5:',serve_md5) client.close()