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