PYTHON——TCPUDP:Socket实现远程执行命令
生活随笔
收集整理的這篇文章主要介紹了
PYTHON——TCPUDP:Socket实现远程执行命令
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文介紹客戶端client輸入dos指令,并將dos指令發送給服務端server,服務端接收到指令,通過調用subprocess模塊的Popen方法實例化一個子進程對象,子進程對象執行完指令后,將結果并通過管道方式回送到主進程。其中,subprocess的用法,參見:Python subprocess模塊解析。
一、通過發送字符串長度的方法:
1、服務端程序:cmd_server.py:
import socket import subprocessimport time# subprocess.Popen() 重要方法.# 學socket的秘籍:一收一發 sk = socket.socket() host='' #空表示本機,等效于127.0.0.1和localhost port=8000 address = (host,port) sk.bind(address) sk.listen(3) print('waiting......') # conn,addr = sk.accept() #這個conn是客戶端的socket對象。非常重要。while True:conn, addr = sk.accept() # 這個conn是客戶端的socket對象。非常重要。print(addr)while True:try:data = conn.recv(1024)except Exception:breakif not data: #客戶端退出時,最后還是會給服務端發送一個空串。即data為空。breakprint('--------->',str(data,'utf8'))obj=subprocess.Popen(str(data,'utf8'),shell=True,stdout=subprocess.PIPE)cmd_result = obj.stdout.read() #bytes類型result_len = bytes(str(len(cmd_result)),'utf8')conn.sendall(result_len) #必須先傳一個長度過去
# time.sleep(1) #兩個發送指令send或sendall連在一起,會出現粘包現象。解決粘包現象,就是加入sleep
conn.recv(1024) #通過一收一發方式,多引入一個短收,解決粘包問題。
conn.sendall(cmd_result) conn.close()
2、客戶端程序:cmd_client.py:
import socketsk=socket.socket() address = ('127.0.0.1',8000) sk.connect(address)while True:inp = input('>>>')if inp=='exit':breaksk.send(bytes(inp,'utf8'))result_len = int(str(sk.recv(1024),'utf8'))sk.send(bytes('ok')) #用于解決粘包現象print(result_len)data=bytes() #初始化一個bytes類型的變量,就像初始化sum=0一樣while len(data)!=result_len:temp = sk.recv(1024)data += tempprint(str(data,'gbk'))sk.close()
二、更好的方法:
1、服務端程序:cmd_server.py:
import socket import subprocess# subprocess.Popen() 重要方法. # 學socket的秘籍:一收一發 sk = socket.socket() host='' #空表示本機,等效于127.0.0.1和localhost port=8000 address = (host,port) sk.bind(address) sk.listen(3) print('waiting......') # conn,addr = sk.accept() #這個conn是客戶端的socket對象。非常重要。while True:conn, addr = sk.accept() # 這個conn是客戶端的socket對象。非常重要。print(addr)while True:try:data = conn.recv(1024)except Exception:breakif not data: #客戶端退出時,最后還是會給服務端發送一個空串。即data為空。breakprint('--------->',str(data,'utf8'))obj=subprocess.Popen(str(data,'utf8'),shell=True,stdout=subprocess.PIPE)cmd_result = obj.stdout.read() #bytes類型# result_len = bytes(str(len(cmd_result)),'utf8')
# conn.sendall(result_len) #必須先傳一個長度過去
# conn.recv(1024) #兩個發送指令send或sendall連在一起,可能會出現粘包現象。解決粘包現象,就是加入臨時阻塞
conn.sendall(cmd_result) conn.close()
?
2、客戶端程序:cmd_client.py
import socketsk=socket.socket() address = ('127.0.0.1',8000) sk.connect(address) buffersize=1024 while True:inp = input('>>>')if inp=='exit':breaksk.send(bytes(inp,'utf8'))fullDataBtyes = b'' #初始化一個bytes類型的變量,等效于fullDataBytes=bytes()。while True:data = sk.recv(buffersize)fullDataBtyes += dataif len(data)<buffersize:break;print(str(fullDataBtyes,'gbk'))# result_len = int(str(sk.recv(1024),'utf8'))# sk.send(bytes('ok')) #解決粘包# print(result_len)# data=bytes() #初始化一個bytes類型的變量,就像初始化sum=0一樣# while len(data)!=result_len:# temp = sk.recv(1024)# data += temp# print(str(data,'gbk')) sk.close()?
參考:
1、‘’老男孩‘’python全棧開發,袁老師講解
2、參考《python從菜鳥到高手》,作者:李寧
轉載于:https://www.cnblogs.com/chenhaiming/p/9886288.html
總結
以上是生活随笔為你收集整理的PYTHON——TCPUDP:Socket实现远程执行命令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iview在vue-cli3如何按需加载
- 下一篇: 解决 'config.h' file n