目錄html
subprocess 模塊容許你去建立一個新的進程讓其執行另外的程序,並與它進行通訊,獲取標準的輸入、標準輸出、標準錯誤以及返回碼等。更多查看官網:https://docs.python.org/2/library/subprocess.html?highlight=subprocess#frequently-used-argumentspython
能夠經過subprocess 模塊去執行命令linux
執行命令,把執行的正確結果放到管道中,把執行錯誤的結果也放到管道中shell
obj=subprocess.Popen(命令, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
windows
注意:的結果的編碼是以當前所在的系統爲準的,若是是windows,那麼res.stdout.read()讀出的就是GBK編碼的,在接收端需要用GBK解碼,正所謂用什麼格式編碼就用什麼格式解碼服務器
# subprocess 執行系統命令的模塊 import subprocess # 把執行的正確結果放到管道中 obj=subprocess.Popen('tasklist',shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE) #拿到正確結果的管道,讀出裏面的內容 ss=obj.stdout.read() err=obj.stderr.read() print('錯誤信息',str(err,encoding='gbk')) #由於windows用的gbk編碼,用gbk解碼 print(str(ss,encoding='gbk'))
import socket import subprocess HOST = "192.168.11.237" PORT = 8081 soc = socket.socket(socket.AF_INET,socket.SOCK_STREAM) soc.bind((HOST,PORT)) soc.listen(5) while 1: print("等待鏈接。。。") conn,addr = soc.accept() print("鏈接成功。。。\n") while 1: try: data = conn.recv(1024) if len(data)==0: # 長度0說明斷開了鏈接。在windows中沒用,在linux中才有用 break # 把執行正確的內容放到管道中 obj = subprocess.Popen(str(data,encoding="utf8"),shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE) # 執行的結果 b 格式,gbk編碼(windows平臺) suc_msg = obj.stdout.read() if suc_msg: conn.send(suc_msg) else: fail_msg = obj.stderr.read() conn.send(fail_msg) except: print("客戶機鏈接中斷。。。") break conn.close() soc.close()
import socket HOST = "192.168.11.237" PORT = 8081 soc = socket.socket() soc.connect((HOST,PORT)) while 1: try: cmd = input("請輸入須要執行的命令") soc.send(cmd.encode("utf8")) data = soc.recv(1024) print(data.decode("gbk")) except Exception as a: print("服務器關閉了:",a) break # 4.關閉鏈接 soc.close()
輸入dir
命令,因爲服務端發送字節少於1024字節,客戶端能夠接受。ssh
輸入tasklist
命令,因爲服務端發送字節多於1024字節,客戶端只接受部分數據,而且當你再次輸入dir
命令的時候,客戶端會接收dir
命令的結果,可是會打印上一次的剩餘未發送完的數據,這就是粘包問題。socket