Ouvir Soquete Python
Todo o abaixo mencionado está em máquinas de janelas que usam python 2.7
Olá,
Atualmente estou tentando ouvir em um soquete para envio de dados por um programa remoto. Esses dados são então impressos na tela e a entrada do usuário é solicitada, retornando então ao programa remoto. No teste eu pude fazer o programa remoto me enviar um menu de programas de linha de comando (cmd, ipconfig, whoami, ftp) e então meu programa retorna com um número como uma seleção da opção de menu.
O programa remoto recebe minha resposta e envia a saída do comando selecionado. ipconfig e whoami funcionam perfeitamente, mas o cmd e o ftp só retornam a saída do terminal uma vez. (I.E. Eu posso inserir um comando no programa FTP e enviar também o programa remoto antes que eu nunca ouça de volta)
A parte do meu código que falha é queif ready[0]:
nunca fica pronto uma segunda vez após a primeira conversa.
Eu sei que o programa remoto está funcionando corretamente, como eu posso usar o netcat para agir no lugar do meu código e operar o terminal cmd indefinidamente.
Como faço para implementar corretamente um listener de soquete python que possa ser responsável por esse tipo de conexão?
Meu "programa" na sua totalidade:
import socket, sys, struct, time, select
host = ''
port = 50000
connectionSevered=0
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error:
print 'Failed to create socket'
sys.exit()
print '[+] Listening for connections on port '+str(port)+'.'
s.bind((host,port))
s.listen(5)
def recvall(the_socket,timeout=2):
global connectionSevered
data=''; # Data found by recv
total_data=[]; # Finally list of everything
s.setblocking(0) #make socket non blocking
begin=time.time() #beginning time
while 1:
ready = select.select([client], [], [], .2)
if time.time()-begin > timeout:
print 'Timeout reached'
#Leave loop, timer has reached its threshold
break
if ready[0]:
print 'In ready loop!'
try:
data = client.recv(4096) #attempt to fetch data
if data:
begin=time.time() #reset timeout timer
total_data.append(data)
data='';
except socket.error:
print '[+] Lost connection to client. Printing buffer...'
connectionSevered=1 # Let main loop know connection has errored
pass
time.sleep(1)
#join all parts to make final string
return ''.join(total_data)
client, address = s.accept()
print '[+] Client connected!'
while (connectionSevered==0): # While connection hasn't errored
print "connectionSevered="+str(connectionSevered) # DEBUG
recvall(s)
response = raw_input() #take user input
client.sendto(response) #send input
client.close(0)
Por favor, deixe-me saber se você precisar de mais informações, qualquer ajuda seria muito apreciada, eu sou muito novo para isso e ansioso para aprender.