Diferencias de variables de entorno al utilizar Paramiko

Me estoy conectando a SSH a través de terminal (en Mac) y ejecuto un script de Paramiko Python y, por alguna razón, las sesiones parecen comportarse de manera diferente.

La PATH entorno PATH , es diferente en ambos casos.

Este es el código que ejecuto:

 import paramiko ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('host', username='myuser',password='mypass') stdin, stdout, stderr =ssh.exec_command('echo $PATH') print (stdout.readlines()) 

¿Alguna idea de por qué las variables de entorno son diferentes?

¿Y cómo puedo arreglarlo?

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


Para emular el comportamiento predeterminado de Paramiko con el ssh , use el interruptor -T :

 ssh -T myuser@host 

Ver al hombre ssh :

-T Desactivar la asignación de pseudo-tty.


Al contrario, para emular el comportamiento de ssh predeterminado con Paramiko, establezca el parámetro get_pty del exec_command en True :

 def exec_command(self, command, bufsize=-1, timeout=None, get_pty=False): 

Aunque en lugar de solucionar el problema asignando el pseudo terminal en Paramiko, debería corregir mejor sus scripts de inicio para establecer el mismo PATH para todas las sesiones.

Para eso, vea Algunos comandos de Unix fallan con “ no encontrado”, cuando se ejecutan usando Python Paramiko exec_command .

Trabajar con el objeto Channel lugar del objeto SSHClient solucionó mi problema.

 chan=ssh.invoke_shell() chan.send('echo $PATH\n') print (chan.recv(1024)) 

Para más detalles, consulte la documentación.