Implementar um shell interativo sobre ssh no Python usando o Paramiko?

Quero escrever um programa (no Python 3.x no Windows 7) que execute vários comandos em um shell remoto via ssh. Após examinar a função exec_command () dos paramikos, percebi que não é adequado para o meu caso de uso (porque o canal é fechado após a execução do comando), pois os comandos dependem de variáveis de ambiente (definidas por comandos anteriores) e não podem ser concatenadas em uma chamada exec_command (), pois elas devem ser executadas em momentos diferentes do programa.

Assim, eu quero executar comandos no mesmo canal. A próxima opção que eu examinei foi implementar um shell interativo usando a função invoke_shell () dos 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() 

Existem alguns problemas com este código:

A primeira 'impressão' nem sempre imprime a saída 'ls' (às vezes é impressa apenas na segunda 'impressão').Os primeiros comandos 'cd' e 'ls' estão sempre presentes na saída (eu os obtenho através do comando 'recv', como parte da saída), enquanto todos os comandos 'cd' e 'ls' são impressos às vezes, e às vezes não são.Os segundo e terceiro comandos 'cd' e 'ls' (quando impressos) sempre aparecem antes da primeira saída 'ls'.

Estou confuso com esse "não determinismo" e agradeceria muito sua ajuda.

questionAnswers(2)

yourAnswerToTheQuestion