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.