立即學習:https://edu.csdn.net/course/play/24458/296239?utm_source=blogtoedu
1.服務器端:接收客戶端發送的命令,subprocess.POPE()函數可用于產生一個子進程,并且返回子進程的結果
import socket
import subprocessphone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
phone.bind(('127.0.0.1',8080))
phone.listen(5)
while True:#1)接收客戶端發送過來的命令res = phone.accept()conn,client_addr = reswhile True:try:cmd = conn.recv(1024)#2)處理命令,執行命令并且獲得命令得到的結果obj = subprocess.Popen(cmd.decode('utf-8'),shell=True,stdout=subprocess.PIPE,#將正確運行命令得到的結果傳給管道stdout中stderr=subprocess.PIPE)#將沒有正確運行命令得到的返回信息存放在stderr管道中stdout = obj.stdout.read()stderr = obj.stderr.read()data = stdout + stderr#3)將結果進行發送給客戶端conn.send(data)except ConnectionResetError:breakconn.close()
phone.close()
?
2.客戶端:向服務器端發送一個命令,并且獲取由服務器執行命令后的結果,并且打印出來,主要知識點:subprocess/Popen/stdout=subprocess.PIPE/stderr=subprocess.PIPE
import socket
#1、設置phone套接字
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#2、連接服務器(打電話),本地地址:127.0.0.1
phone.connect(('127.0.0.1',8080))
#3、向服務器發送請求send(),發送的數據不能直接發送字符串,因為要傳送到物理層底層,因此需要轉換成二進制的bytes類型進行發送,只需:發送的數據.encode('utf-8')即可
while True:'''實現在客戶端輸入一個命令,然后命令發送給服務器端,服務器端進行命令的執行,然后再服務器端執行的命令的結果返回給客戶端'''#1)、向服務器端發送命令cmd = input("請輸入命名:")#修復客戶端發送空字符串而服務器卡在接收信息處的bug,continue表示跳出本次循環,重新開始下一次的循環if not cmd:continuephone.send(cmd.encode('utf-8'))#2)、接收服務器端執行命令后的結果res = phone.recv(1024)#接收小于1024bytes的數據print('服務器返回來的數據:',res.decode('gbk'))#5、關閉套接字phone
phone.close()
?
3.注:客戶端發送給服務器的數據必須是bytes類型,使用encode('utf-8'),客戶端接收到的數據也是bytes類型,如果需要在客戶端打印出接收到服務器的bytes類型數據,那就需要解碼,window系統默認的解碼方式‘gbk’,Linux系統默認的解碼方式是“utf-8”,需要打印則用語句:
#data是客戶端接收到的由服務器傳回來的bytes類型數據,此處是windows系統,默認的解碼方式是gbkprint(data.decode('gbk'))
?
4.補充:windows命令
1)dir:返回子文件名和子文件夾名
2)ipconfig:返回本地網關ip地址
3)tasklist:返回正在運行的進程的相關信息
?
5.上述程序運行的結果,下面的結果出現了粘包現象,具體粘包的含義以及出現的原因和結果方法見下一篇學習筆記
請輸入命名:dir /
服務器返回來的數據: 無效開關 - ""。請輸入命名:dir
服務器返回來的數據: 驅動器 C 中的卷是 本地磁盤卷的序列號是 B476-3C7CC:\Users\jinlin\Desktop\python_further_study\socket編程\模擬ssh遠程操作命令 的目錄2020/03/07 14:01 <DIR> .
2020/03/07 14:01 <DIR> ..
2020/03/07 13:35 0 __init__.py
2020/03/07 10:02 895 客戶端_.py
2020/03/07 14:01 1,055 服務器端_.py3 個文件 1,950 字節2 個目錄 125,989,347,328 可用字節請輸入命名:dir e
服務器返回來的數據: 驅動器 C 中的卷是 本地磁盤卷的序列號是 B476-3C7CC:\Users\jinlin\Desktop\python_further_study\socket編程\模擬ssh遠程操作命令 的目錄找不到文件請輸入命名:dir /e
服務器返回來的數據: 無效開關 - "e"。請輸入命名:tasklist
服務器返回來的數據:
映像名稱 PID 會話名 會話# 內存使用
========================= ======== ================ =========== ============
System Idle Process 0 Services 0 4 K
System 4 Services 0 584 K
smss.exe 324 Services 0 804 K
csrss.exe 524 Services 0 9,040 K
csrss.exe 620 Console 1 30,284 K
wininit.exe 628 Services 0 4,144 K
winlogon.exe 656 Console 1 6,512 K
services.exe 724 Services 0 8,284 K
lsass.exe 732 Services 0 11,456 K
svchost.exe 804 Services 0 11,364 K
svchost.exe 844 Services 0 8,864 K
dwm.exe
請輸入命名:ipconfig
服務器返回來的數據: 948 Console 1 24,472 K
nvvsvc.exe 956 Services 0 4 K
nvxdsync.exe 1000 Console 1 824 K
nvvsvc.exe 1008 Console 1 200 K
svchost.exe 276 Services 0 30,968 K
svchost.exe 392 Services 0 43,000 K
svchost.exe 412 Services 0 24,864 K
svchost.exe 736 Services 0 49,704 K
RtkAudioService64.exe 1056 Services 0 4 K
RAVBg64.exe 1076 Console 1 352 K
RAVBg64.exe 1084 Console 1 344 K
ZhuDongFangYu.exe 1128 Services 0 3,320 K
svchost.exe 1280 Services 0 16,404 K
spoolsv.exe
?