es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo usar subprocess.Popen para iniciar una nueva tarea en una computadora remota con ssh.

Echa un vistazo a esto:

ssh_cmd = [“ssh”, “pi@” + “100.117.210.18”, “roslaunch minirover mr_bru_bringup.launch”]
cmd1 = subprocess.Popen(” “.join(ssh_cmd), shell=True, stdout=subprocess.PIPE)
cmd1_out = cmd1.stdout.read()
print(cmd1_out)

Resulta que roslaunch inicia un proceso de larga duración en el equipo ssh. La secuencia anterior funciona, pero no se completa.

Me gustaría permitir que siga ejecutándose pero que la secuencia anterior se complete para poder emitir otro comando ssh que inicie otro shell.

No estoy seguro de cómo hacer esto después de muchos experimentos.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en Python y SSH, hay algunas opciones para resolver este problema.

    1. Utilizar el constructor subprocess.Popen() para iniciar el comando SSH en segundo plano y redirigir la salida estándar (stdout) a un archivo o a subprocess.PIPE. De esta manera, el comando puede seguir ejecutándose y el script de Python puede continuar emitiendo comandos SSH adicionales.

    Ejemplo:

    ssh_cmd = ["ssh", "pi@" + "100.117.210.18", "roslaunch minirover mr_bru_bringup.launch"]
    cmd1 = subprocess.Popen(" ".join(ssh_cmd), shell=True, stdout=subprocess.PIPE)
    # Redirigir stdout a un archivo:
    # cmd1 = subprocess.Popen(" ".join(ssh_cmd) + " >> logfile.log", shell=True)
    # Utilizar PIPE y communicate para leer la salida:
    # cmd1_out, _ = cmd1.communicate()
    
    # El script de Python puede continuar mientras el comando SSH se está ejecutando:
    time.sleep(10) # Retraso de ejemplo
    
    # Emitir comando SSH adicional:
    # ssh_cmd2 = ["ssh", "pi@" + "100.117.210.18", "some_other_command"]
    
    1. Utilizar la biblioteca paramiko para establecer una conexión SSH y ejecutar comandos en el host remoto. De esta manera, los comandos SSH se pueden ejecutar de forma sincrónica o asincrónica y el script de Python puede gestionar la conexión y la ejecución de comandos.

    Ejemplo:

    import paramiko
    
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect("100.117.210.18", username="pi", password="password")
    stdin, stdout, stderr = ssh.exec_command("roslaunch minirover mr_bru_bringup.launch &")
    # Utilizar stdin para ingresar datos al comando, y stdout/stderr para leer la salida/errores.
    # Utilizar ssh.invoke_shell() para una sesión de shell interactiva.
    # Utilizar ssh.open_sftp() para transferencia de archivos a través de SSH.
    
    # El script de Python puede continuar mientras el comando SSH se está ejecutando:
    time.sleep(10) # Retraso de ejemplo
    
    # Emitir comando SSH adicional:
    stdin, stdout, stderr = ssh.exec_command("some_other_command")
    
    ssh.close()
    

Comments are closed.