Python_Socket实现简单的ssh/ftp

Socket实现简单的ssh

ssh_服务器端

import socket
import os
import time

host = "0.0.0.0"


def echo_server(port):
    """A simple echo server"""
    #Create a TCP socket
    sock = socket.socket()

    #Enable reuse address/port
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

    #Bind the socket to the port
    server_address = (host, port)
    sock.bind(server_address)
    print("Starting up echo server on %s port %s" % (server_address))

    sock.listen(5)

    while True:
        print("Waiting for connection client")

        client, address = sock.accept()

        while True:
            data = client.recv(1024)

            if not data:
                print("Client has lost....")
                print("-----------------End-------------------")
                break

            print("Client sending data:", data.decode())               
            resp = os.popen(data.decode()).read()
            # print("resp size:", len(resp)) #总大小
            client.send(str( len(resp.encode("utf-8"))).encode("utf-8") ) #告诉客户端将要接收的数据大小            
            # time.sleep(0.5) #Set timeout  解决粘包
            client_ack = client.recv(1024) #wait client to confirm  解决粘包
            print("ack from client:", client_ack.decode())
            client.send(resp.encode("utf-8"))
            print("------------------------------------------")
    #end connection
    client.close()
    sock.close()

if __name__ == "__main__":
    echo_server(9999)

ssh_客户端

import socket  
  
host = "192.168.224.128"  
  
def echo_client(port):  
    """Create a TCP/IP socket"""  
    client = socket.socket()  
  
    #Connect the socket to the server  
    server_address = (host, port)  
    client.connect(server_address)  
    print("Connecting to %s port %s" % server_address)  
  
    while True:  
        #Send data  
        message = input("Please enter the information sent>>>:")  
        if ( len(message) == 0 ): continue  
        client.send(message.encode("utf-8"))  
  
        #Receive message from the server  
        data_size = client.recv(1024) #接收来自服务器发来的数据大小  
        print("data_size:", data_size.decode())  
  
        client.send("准备好接收了,可以发了".encode("utf-8"))  
          
        receive_size = 0  
  
        while receive_size != int(data_size.decode()):  
  
            data = client.recv(1024)  
            # 每次收到的大小可能小于1024,所以必须用len获取大小  
            receive_size += len(data)   
            print(data.decode())  
        else:  
            print("----------------------End-------------------", receive_size)  
    client.close()  
  
if __name__ == "__main__":  
    echo_client(9999) 

Socket实现简单的ftp

服务器端

import socket
import os
import hashlib

host = "0.0.0.0"


def echo_server(port):
    """A simple echo server"""
    #Create a TCP socket
    sock = socket.socket()

    #Enable reuse address/port
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

    #Bind the socket to the port
    server_address = (host, port)
    sock.bind(server_address)
    print("Starting up echo server on %s port %s" % (server_address))

    sock.listen(5)

    while True:
        print("Waiting for connection client")

        client, address = sock.accept()

        while True:
            data = client.recv(1024)

            if not data:
                print("Client has lost....")
                print("-----------------End-------------------")
                break


            cmd, filename = data.decode().split()    
            print("filename:", filename)

            if os.path.isfile(filename):
                f = open(filename, "rb")
                m = hashlib.md5()
                file_size = os.stat(filename).st_size
                client.send( str(file_size).encode("utf-8") ) #send file size
                client.recv(1024) #wait for ack
                for line in f:
                    m.update(line)
                    client.send(line)
                print("server file md5:", m.hexdigest())
                print("++++++++++++++++++++++++++++++++++++++++++++++++")
                f.close()

                client.send(m.hexdigest().encode("utf-8")) #两句send连着可能出现粘包
                
    #end connection
    client.close()
    sock.close()

if __name__ == "__main__":
    echo_server(9999)

客户端

import socket
import hashlib

host = "192.168.224.128"

def echo_client(port):
	"""Create a TCP/IP socket"""
	client = socket.socket()

	#Connect the socket to the server
	server_address = (host, port)
	client.connect(server_address)
	print("Connecting to %s port %s" % server_address)

	while True:
		#Send data
		cmd = input("Please enter the information sent>>>:")
		if ( len(cmd) == 0 ): continue

		if cmd.startswith("get"):
			client.send(cmd.encode("utf-8"))
			server_response = client.recv(1024) #接收来自服务器发来的数据大小通知
			print("server response the file size:", server_response.decode())

			client.send("ready to recv file".encode("utf-8")) #告诉服务器可以接收了#主要是设置超时,防止出现沾包

			file_total_size = int( server_response.decode() )
			receive_size = 0

			filename = cmd.split()[1]
			f = open(filename + ".new", "wb")
			m = hashlib.md5()

			while receive_size < file_total_size: #防止出现粘包
				if file_total_size - receive_size > 1024: #要收不止一次
					size = 1024
				else: #最后一次,剩多少收多少
					size = file_total_size - receive_size
					print("last receive size:", size)

				data = client.recv(size)
				m.update(data)
				receive_size += len(data)
				f.write(data)
				# print(receive_size, file_total_size)
			else:
				client_file_md5 = m.hexdigest()
				print( "file_total_size: %d 	receive_size: %d" % (file_total_size, receive_size))
				print("------------file recv done-----------")
				f.close()
			server_file_md5 = client.recv(1024)
			print("server file md5:", server_file_md5.decode())
			print("client file md5:", client_file_md5)
			print("++++++++++++++++++++++++++++++++++++++++++++++++++")

	sock.close()

if __name__ == "__main__":
	echo_client(9999)

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值