用scoket 写一个简版的ssh
服务端:
1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4 5 import socket,os 6 7 s=socket.socket()#实例化一个 socket 8 9 s.bind(('localhost',9100))#绑定一个监听端口 10 11 s.listen(5)#监听列表 5 个 12 print('监听中...') 13 while True: 14 conn,addr=s.accept()#监听到新的接连 15 print('连接到新的地址:',addr) 16 while True: 17 data=conn.recv(4092)#接收数据 18 if not data:#如果收的数据为空 19 print('客户端已经断开!') 20 break 21 print('指令:',data.decode()) 22 cmd_res=os.popen(data.decode()).read()#读取数据,指令 23 #cmd_res_l=len(cmd_res.encode('utf-8'))#数据大小 24 25 if len(cmd_res)==0: 26 cmd_res='指令错误!' 27 continue 28 #conn.recv(1) 29 conn.send(str(len(cmd_res.encode('utf-8'))).encode('utf-8') )#发送数据的大小 30 #print(len(cmd_res)) 31 clinet_ack=conn.recv(1024)#为了去粘包 32 33 conn.send(cmd_res.encode('utf-8'))#发送指令 34 #print(cmd_res.encode('utf-8')) 35 print('发送完毕!') 36 else: 37 s.close()
客户端:
1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4 import socket 5 c=socket.socket()#实例化一个socket 6 7 c.connect(('localhost',9100))#客户端连联 8 while True: 9 cho=input('指令:').strip() 10 if len(cho)==0:continue 11 c.send(cho.encode('utf-8'))#发送数据 12 cmd_res_size=c.recv(1024)#接收数据 数据大小 13 print('数据大小:',cmd_res_size) 14 size_l=0#收数据当前大小 15 c.send('确认!'.encode('utf-8'))#为了去粘包 16 while size_l< int(cmd_res_size.decode()): 17 data=c.recv(1024)#开始接收数据 18 size_l+=len(data)#加上 19 print(data.decode()) 20 print(size_l) 21 else: 22 print('接收完毕',size_l)
在win10下,recv(1024)的时候ipconfig指令 会出错,其它的命令暂时没发现