Реализовать интерактивную оболочку через ssh в Python, используя Paramiko?

Я хочу написать программу (в Python 3.x в Windows 7), которая выполняет несколько команд на удаленной оболочке через ssh. Посмотрев на функцию exec_command () paramikos, я понял, что она не подходит для моего варианта использования (поскольку канал закрывается после выполнения команды), так как команды зависят от переменных среды (заданных предыдущими командами) и не могут быть объединены в один вызов exec_command (), поскольку они должны выполняться в разное время в программе.

Таким образом, я хочу выполнять команды в одном канале. Следующим вариантом, который я изучил, была реализация интерактивной оболочки с использованием функции invoke_shell () от paramikos:

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, username=user, password=psw, port=22)

channel = ssh.invoke_shell()

out = channel.recv(9999)

channel.send('cd mivne_final\n')
channel.send('ls\n')

while not channel.recv_ready():
    time.sleep(3)

out = channel.recv(9999)
print(out.decode("ascii"))

channel.send('cd ..\n')
channel.send('cd or_fail\n')
channel.send('ls\n')

while not channel.recv_ready():
    time.sleep(3)

out = channel.recv(9999)
print(out.decode("ascii"))

channel.send('cd ..\n')
channel.send('cd simulator\n')
channel.send('ls\n')

while not channel.recv_ready():
    time.sleep(3)

out = channel.recv(9999)
print(out.decode("ascii"))

ssh.close() 

Есть некоторые проблемы с этим кодом:

Первый «print» не всегда печатает вывод «ls» (иногда он печатается только на втором «print»).Первые команды «cd» и «ls» всегда присутствуют в выходных данных (я получаю их с помощью команды «recv», как часть выходных данных), в то время как все последующие команды «cd» и «ls» иногда печатаются, а иногда нет.Вторая и третья команды «cd» и «ls» (при печати) всегда появляются перед первым выводом «ls».

Я запутался с этим «недетерминизмом» и был бы очень признателен за вашу помощь.

Ответы на вопрос(2)

Ваш ответ на вопрос