用scoket 寫一個簡版的ssh 服務端: 客戶端: 在win10下,recv(1024)的時候ipconfig指令 會出錯,其它的命令暫時沒發現 ...
用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指令 會出錯,其它的命令暫時沒發現