python基礎—socket套接字(4)基於tcp實現遠端執行命令
阿新 • • 發佈:2020-12-27
1.python執行shell命令要用到一個模組subpross。模組允許你生成新的程序,連線它們的輸入、輸出、錯誤管道,並且獲取它們的返回碼
如:在cmd執行ipconfig命令
import subprocess # 建立子程式 subprocess_obj = subprocess.Popen('ipconfig', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE ) '''當shell=True時,表示在系統預設的shell環境中執行新的程序,此shell在windows表示為cmd.exe,在linux為/bin/sh subprocess.PIPE表示開啟標準流的管道 stdout從子程序捕獲到的標準輸出. 一個位元組序列, 或一個字串 stderr捕獲到的子程序的標準錯誤. 一個位元組序列, 或者一個字串, ''' stdout_res = subprocess_obj.stdout.read() # 讀取輸出結果。標準輸出是byte型別 stderr_res = subprocess_obj.stderr.read()print(stdout_res.decode('gbk'))#windows預設編碼為gbk print(stderr_res.decode('gbk'))
2.有了subpross,在上兩次課的基礎上修改即可。
#服務端 import socket import subprocess socket_obj = socket.socket(socket.AF_INET, socket.SOCK_STREAM) socket_obj.bind(('127.0.0.1', 8080)) socket_obj.listen(5) while True: fd, addr = socket_obj.accept()try: while True: cmd = fd.recv(1024) obj = subprocess.Popen( cmd.decode('utf8'), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE ) stdout_res = obj.stdout.read() # 標準輸出是byte格式,widows是gbk編碼 stderr_res = obj.stderr.read() print(stdout_res.decode('gbk')) print(stderr_res.decode('gbk')) fd.send(stdout_res) fd.send(stderr_res) except ConnectionResetError: print('客戶端關閉') fd.close()
#客戶端 import socket client_obj = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client_obj.connect(('127.0.0.1', 8080)) while True: cmd = input('請輸入cmd命令:').strip() if not cmd: continue client_obj.send(cmd.encode('utf8')) cmd_res = client_obj.recv(1024) print(cmd_res.decode('gbk'))
如果客戶端執行的結果比較大,超過了recv的大小,客戶端接收不乾淨,造成粘包了,怎麼處理呢?