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)