python之模仿ssh服务

小白练习笔记

 

import socket
import os
server = socket.socket()      #实例化
server.bind(('localhost',9999))  #绑定ip及端口

server.listen()          #监听

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.encode('utf-8')))    
if len(cmd_res) == 0:              #防止无返回信息,客户端卡死
cmd_res = 'cmd has no output....'
conn.send(str(len(cmd_res.encode('utf-8'))).encode('utf-8'))    #通知客户端返回信息长度,注意编码,汉字占3字节,如果不编码将导致字节数不一致
     client_ack = conn.recv(1024)       #socket服务两次发送数据之间如果没有间隔,有可能在缓冲区合并为一条发送。这将导致客户端报错,在两次之间加一次接收确认,将socket粘包有效分割开
conn.send(cmd_res.encode('utf-8'))      #发送信息,将信息转换成字节码
print('send done')    
server.close()

posted on 2018-09-14 16:22  kcrist  阅读(203)  评论(0编辑  收藏  举报

导航