Paramiko SSHClient no puede ejecutar todo el script de shell en una computadora remota [duplicado]

Oct 15 2020

Me gustaría ejecutar un script Bash remoto usando el script Python en la computadora local.

Script Bash en computadora remota

# script.sh    
#!/bin/bash

echo "... Options ..."
echo "  1) Option 1"
echo "  2) Option 2"

read -p "Enter [1/2] : " n

case $n in
  1) echo "Option 1 selected";;
  2) echo "Option 2 selected";;
  *) echo "Invalid option";;
esac

Secuencia de comandos de Python en la computadora local

# script.py
import sys
from paramiko import SSHClient

hostname = '10.0.0.1'
username = 'u'
password = 'p'

client = SSHClient()
client.load_system_host_keys()
client.connect(hostname, username=username, password=password)

stdin, stdout, stderr = client.exec_command('./script.sh')

for line in stdout:
    sys.stdout.write(line)

No tengo problemas para ejecutar script.shen una computadora remota.

remote@computer:~$ ./script.sh 
... Options ...
  1) Option 1
  2) Option 2
Enter [1/2] : 1
Option 1 selected
remote@computer:~$ 

El problema es que cuando intento con el script de Python en la computadora local, el script parece bloquearse. Ni siquiera veo Enter [1/2] : que se haya ejecutado la línea.

local@computer:~$ python script.py 
... Options ...
  1) Option 1
  2) Option 2

¿Qué hay de malo en este código?

Salida deseada

local@computer:~$ python script.py ... Options ... 1) Option 1 2) Option 2 Enter [1/2] : 1 Option 1 selected local@computer:~$ 

Respuestas

1 user14251572 Oct 15 2020 at 13:56

Tratar

stdin.write('1')
stdin.write('\n')
stdin.flush()

output = stdout.readlines()
print(''.join(output))

p.ej

$ python script.py ... Options ... 1) Option 1 2) Option 2 Option 1 selected $