Algunos comandos de Unix fallan con ” no encontrado”, cuando se ejecuta usando Python Paramiko exec_command

Estoy intentando ejecutar el comando sesu en el servidor Unix de Python con la ayuda de Paramiko exec_command . Sin embargo, cuando exec_command('sesu test') este comando exec_command('sesu test') , exec_command('sesu test')

sh: sesu: no encontrado

Cuando estoy ejecutando el comando ls simple, me da el resultado deseado. Sólo con el comando sesu no funciona bien.

Así es como se ve mi código:

 import paramiko host = host username = username password = password port = port ssh=paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(ip,port,username,password) stdin,stdout,stderr=ssh.exec_command('sesu test') stdin.write('Password') stdin.flush() outlines=stdout.readlines() resp=''.join(outlines) print(resp) 

El SSHClient.exec_command por defecto no asigna un pseudo terminal para la sesión. Como consecuencia, un conjunto diferente de scripts de inicio es (podría ser) de origen (especialmente para sesiones no interactivas, no se obtiene .bash_profile ), que en su sesión regular de SSH interactiva. Y / o se toman diferentes twigs en los scripts, en función de una ausencia / presencia de la variable de entorno TERM .

  1. Corrija el comando para no confiar en un entorno específico. Utilice una ruta completa a sesu en el comando. P.ej:

     /bin/sesu test 

    Si no conoce la ruta completa, en los sistemas comunes * nix, puede usar which sesu comando which sesu en su sesión SSH interactiva.

  2. Arregle sus scripts de inicio para establecer el PATH igual para sesiones interactivas y no interactivas.

  3. Intente ejecutar el script explícitamente a través del shell de inicio de sesión (use --login switch with common * nix shells):

     bash --login -c "sesu test" 
  4. Si el comando se basa en una configuración de entorno específica y no puede corregir los scripts de inicio, puede cambiar el entorno en el comando en sí. La syntax para eso depende del sistema remoto y / o el shell. En sistemas comunes * nix, esto funciona:

     PATH="$PATH;/path/to/sesu" && sesu test 
  5. Otro enfoque (no recomendado) es forzar la asignación de pseudoterminal para el canal “exec” mediante el método .setPty :

     stdin,stdout,stderr=ssh.exec_command('sesu test', get_pty=True) 

    Usar el pseudo terminal para automatizar la ejecución de un comando puede traerle efectos secundarios desagradables. Vea, por ejemplo, ¿hay una forma sencilla de deshacerse de los valores no deseados que vienen cuando utiliza SSH con la biblioteca Paramiko de Python y obtiene la salida de CLI de una máquina remota?


Ver también:

  • Diferencias de variables de entorno al utilizar Paramiko
  • Ciertos comandos de Unix fallan con “… no encontrado”, cuando se ejecutan a través de Java usando JSch