学习笔记(09):Python网络编程并发编程-模拟ssh远程执行命令-代码实现
生活随笔
收集整理的這篇文章主要介紹了
学习笔记(09):Python网络编程并发编程-模拟ssh远程执行命令-代码实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
立即學習: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?
總結
以上是生活随笔為你收集整理的学习笔记(09):Python网络编程并发编程-模拟ssh远程执行命令-代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: proj4经纬度bl转换xy_分享pro
- 下一篇: 学习笔记(10):Python网络编程并