標籤:gpo bre net proc recv obj style phone pipe
一、服務端
1 import socket 2 import subprocess 3 4 phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 5 phone.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 6 phone.bind((‘127.0.0.1‘, 8081)) # 0-65535:0-1024給作業系統使用 7 phone.listen(5) 8 9 print(‘starting......‘)10 while True: # 連結迴圈11 conn, client_addr = phone.accept()12 print(client_addr)13 14 while True: # 通訊迴圈15 try:16 # 1、收命令17 cmd = conn.recv(1024)18 if not cmd: # 適用於linux作業系統19 break20 print(‘用戶端的資料‘, cmd)21 22 # 2、執行命令,拿到結果23 obj = subprocess.Popen(cmd.decode(‘utf-8‘), shell=True,24 stdout=subprocess.PIPE,25 stderr=subprocess.PIPE)26 27 stdout = obj.stdout.read()28 stderr = obj.stderr.read()29 # 3、把命令的結果返回給用戶端30 conn.send(stdout+stderr)31 32 except ConnectionResetError: # 適用於Windows作業系統33 break34 35 conn.close()36 37 phone.close()
二、用戶端
1 import socket 2 import subprocess 3 4 phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 5 phone.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 6 phone.bind((‘127.0.0.1‘, 8081)) # 0-65535:0-1024給作業系統使用 7 phone.listen(5) 8 9 print(‘starting......‘)10 while True: # 連結迴圈11 conn, client_addr = phone.accept()12 print(client_addr)13 14 while True: # 通訊迴圈15 try:16 # 1、收命令17 cmd = conn.recv(1024)18 if not cmd: # 適用於linux作業系統19 break20 print(‘用戶端的資料‘, cmd)21 22 # 2、執行命令,拿到結果23 obj = subprocess.Popen(cmd.decode(‘utf-8‘), shell=True,24 stdout=subprocess.PIPE,25 stderr=subprocess.PIPE)26 27 stdout = obj.stdout.read()28 stderr = obj.stderr.read()29 # 3、把命令的結果返回給用戶端30 conn.send(stdout+stderr)31 32 except ConnectionResetError: # 適用於Windows作業系統33 break34 35 conn.close()36 37 phone.close()
在用戶端運行dir,結果為:
1 C:\Users\xu516\PycharmProjects\Python全棧開發\venv\Scripts\python.exe "C:/Users/xu516/PycharmProjects/Python全棧開發/第三模組/網路編程/04 類比ssh遠程執行命令/用戶端.py" 2 >>:dir 3 磁碟機 C 中的卷是 OS 4 卷的序號是 7849-BAF9 5 6 C:\Users\xu516\PycharmProjects\Python全棧開發\第三模組\網路編程\04 類比ssh遠程執行命令 的目錄 7 8 2018/04/06 13:07 <DIR> . 9 2018/04/06 13:07 <DIR> ..10 2018/04/05 21:18 0 __init__.py11 2018/04/06 13:07 376 用戶端.py12 2018/04/06 13:06 1,146 服務端.py13 2018/04/06 11:56 722 補充.py14 4 個檔案 2,244 位元組15 2 個目錄 36,491,399,168 可用位元組16 17 >>:
服務端運行結果:
1 starting......2 (‘127.0.0.1‘, 62806)3 用戶端的資料 b‘dir‘
Python--網路編程-----socket編程樣本--類比ssh遠程執行命令