Algunos comandos de Unix fallan con "<comando> no encontrado", cuando se ejecuta usando Python Paramiko exec_command
shell ssh (1)
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
de forma predeterminada no ejecuta el shell en modo "inicio de sesión" y 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 ramas en los scripts, en función de una ausencia / presencia de la variable de entorno
TERM
.
Posibles soluciones (en orden de preferencia):
-
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
comandowhich sesu
en su sesión SSH interactiva. -
Arregle sus scripts de inicio para establecer el
PATH
igual para sesiones interactivas y no interactivas. -
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"
-
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 sintaxis para eso depende del sistema remoto y / o el shell. En sistemas comunes * nix, esto funciona:
PATH="$PATH;/path/to/sesu" && sesu test
-
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