Paramiko SSHClient non può eseguire l'intero script della shell sul computer remoto [duplicato]

Oct 15 2020

Vorrei eseguire uno script Bash remoto utilizzando lo script Python sul computer locale.

Script Bash sul computer remoto

# 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

Script Python sul computer locale

# 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)

Non ho problemi con l'esecuzione script.shsu computer remoto.

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

Il problema è che quando provo con lo script Python sul computer locale, lo script sembra essere bloccato. Non vedo nemmeno che la Enter [1/2] : linea sia stata eseguita.

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

Cosa c'è di sbagliato in questo codice?

Uscita desiderata

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

Risposte

1 user14251572 Oct 15 2020 at 13:56

Provare

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

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

per esempio

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