Paramiko SSHClient无法在远程计算机上执行整个shell脚本

问题描述

我想在本地计算机上使用Python脚本执行远程Bash脚本。

远程计算机上的Bash脚本

# 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

本地计算机上的Python脚本

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

在远程计算机上执行script.sh没问题。

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

问题是当我在本地计算机上尝试使用Python脚本时,该脚本似乎已挂起。我什至没有看到Enter [1/2] : 行被执行。

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

代码有什么问题?

所需的输出

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

解决方法

尝试

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

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

例如

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

$