本代码利用python的socket模块来实现一个简单的ssh功能
分配有2个文件 一个做服务器端,一个客户端
服务器端接收命令给客户端返回执行结果
实例
sock_ssh_server.py
##服务器端
import socket ,os,time
server = socket.socket()
#开放的地址和端口,如果通过外网访问改成0.0.0.0
server.bind(('localhost',9999) )
#允许的最大连接数
server.listen(5)
while True:
conn, addr = server.accept()
print("new conn:",addr)
while True:
print("等待指令")
data = conn.recv(1024)
if not data:
print("客户端已断开")
break
print("执行指令:",data)
cmd_res = os.popen(data.decode()).read() #接受字符串,执行结果也是字符串
#print("before send",len(cmd_res)) #打印结果长度
if len(cmd_res) == 0:
cmd_res = "cmd has no output..."
#因为中文字符长度问题,encode2次。
conn.send( str(len(cmd_res.encode())).encode("utf-8") ) #先发大小给客户端
#防止socket粘包,进行一次交互
client_ack = conn.recv(1024)
print("ack from client:",client_ack.decode())
conn.send(cmd_res.encode("utf-8"))
print("send done")
sock_ssh_client.py
import socket
client = socket.socket()
#要链接的ip和端口
client.connect(('localhost',9999))
while True:
cmd = input(">>:").strip()
if len(cmd) == 0: continue
client.send(cmd.encode("utf-8"))
cmd_res_size = client.recv(1024) ##接受命令结果的长度
#print("命令结果大小:",cmd_res_size)
client.send("本客户端准备好接收了!".encode("utf-8"))
received_size = 0
received_data = b''
while received_size < int(cmd_res_size.decode()) :
data = client.recv(1024)
received_size += len(data) #每次收到的有可能小于1024,所以必须用len判断
#print(data.decode())
received_data += data
else:
#print("cmd res receive done...",received_size)
print(received_data.decode())
启动 sock_ssh_server.py和sock_ssh_client.py
效果