Я хочу написать программу (в Python 3.x на Windows 7), которая выполняет несколько команд на удаленной оболочке через ssh. Посмотрев на функцию exec_command() paramikos, я понял, что он не подходит для моего использования (потому что канал закрывается после выполнения команды), так как команды зависят от переменных окружения (установленных предыдущими командами) и не могут быть объединены в один вызов exec_command(), поскольку они должны выполняться в разное время в программе.Внедрить интерактивную оболочку поверх ssh в Python с помощью Paramiko?
Таким образом, я хочу выполнять команды в одном канале. Следующий вариант я заглянула в осуществляет интерактивную оболочку с помощью paramikos' 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()
Есть некоторые проблемы с этим кодом:
- первый „печать“ не всегда печати вывод «ls» (иногда он печатается только во второй «печати»).
- Первые команды «cd» и «ls» всегда присутствуют на выходе (я получаю их через команду «recv», как часть вывода), тогда как все следующие команды «cd» и «ls» иногда печатаются, а иногда и нет.
- Вторая и третья команды 'cd' и 'ls' (при печати) всегда отображаются перед первым выходом 'ls'.
Я смущен этим «недетерминированностью» и очень ценю вашу помощь.
вы получите дополнительную помощь, если заменить тег на меньшее число последователей тегом python, считая, что это действительно код python. удачи. – shellter
Вам нужно использовать 'paramiko'? Мне было гораздо легче работать с «тканью». Вы просто настраиваете переменные 'env', такие как' user', 'password' и' host_string', а затем можете делать различные вещи, такие как use: 'get' для загрузки файлов с удаленного хоста,' put' для отправки файлов и 'run' для выдачи команд. Вы можете цепями таких команд, например: 'run ('cd .. && cd simulator && ls')'. – kchomski
@kchomski, к сожалению, ткань не совместима с python 3.x, поэтому это не вариант. Во всяком случае, из того, что я видел, Fabric - всего лишь обертка для paramiko и не позволяет запускать команды «non-chain» в том же канале. Существует много логики, которые я в конечном счете хочу выполнять между командами оболочки. – misha