Реализовать интерактивную оболочку через 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».Я запутался с этим «недетерминизмом» и был бы очень признателен за вашу помощь.