Я хочу написать программу (в Python 3.x в Windows 7), которая выполняет несколько команд на удаленной оболочке через ssh. Посмотрев на функцию exec_command()
, я понял, что она не подходит для моего exec_command()
использования (поскольку канал закрывается после выполнения команды), поскольку команды зависят от переменных среды (заданных предыдущими командами) и не могут быть объединены в один exec_command()
поскольку они должны выполняться в разное время в программе.
Таким образом, я хочу выполнять команды в одном канале. Следующим вариантом, который я изучил, была реализация интерактивной оболочки с использованием функции invoke_shell()
:
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
.
Я запутался с этим "недетерминизмом" и был бы очень признателен за вашу помощь.