1. 程式人生 > 實用技巧 >python基礎—socket套接字(4)基於tcp實現遠端執行命令

python基礎—socket套接字(4)基於tcp實現遠端執行命令

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的大小,客戶端接收不乾淨,造成粘包了,怎麼處理呢?