Форум сайта python.su
Приветствую, сообщество!
Возник вопрос.
Использую модуль paramiko для выполнения некоторых действий на удаленной машине через SSH.
Легко получается вывести stdout после выполнения команды на удаленке. Но как получать stdout по мере выполнения команды?
Простейший пример команд ‘ping’ или ‘top’. Вообще необходимо отображать ход выполнения долгой программы.
Заранее спасибо.
Вот то, что работает:
import paramiko host = '192.168.217.129' user = 'root' secret = 'root' port = 22 client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect(hostname=host, username=user, password=secret, port=port) stdin, stdout, stderr = client.exec_command('ls -o') for line in stdout.read().splitlines(): print (line) client.close()
Отредактировано GrayShadow (Апрель 6, 2014 01:04:25)
Офлайн
может, так получится (если на той стороне нет блокировки)
for line in stdout: print(line)
Отредактировано py.user.next (Апрель 6, 2014 03:08:32)
Офлайн
Да, Спасибо помогло.
Офлайн
Доброго времени суток!
Имеется следующая проблема:
Вопрос появляется только после ответа, притом на той же строке, что и ответ.
Пробовал:
for line in iter(stdout.readline, “”):
for line in stdout:
Пример вывода:
Host will be turned off.
Are you sure? (Type ‘yes’ to continue) no
Aborted by user
Как вариант можно вместо “exec_command” использовать “invoke_shell”, думаю, что скорее всего поможет, но много кода придётся переписывать.
Есть идеи?
Отредактировано keepermag (Июль 6, 2023 16:18:50)
Офлайн
keepermagВесь код скинь. Используй теги code на форуме.
Имеется следующая проблема:
Вопрос появляется только после ответа, притом на той же строке, что и ответ.
Офлайн
Весь код скинуть проблематично, более 1000 строк, да ещё по файлам распределен.
Использую PyQt5 с многопоточностью.
Вот, что то типо этого, только работает ещё один поток, с которого можно отправлять ответы.
import paramiko client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect(hostname='1.1.1.1', username='admin', password='admin', port=22) stdin, stdout, stderr = client.exec_command('host power off', get_pty=True) for line in stdout: print(line) client.close()
import paramiko client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect(hostname='1.1.1.1', username='admin', password='admin', port=22) channel = client.get_transport().open_session() channel.get_pty() channel.settimeout(15) channel.exec_command('host power off') print(channel.recv(9999)) print(channel.recv(9999)) aa = input() channel.send(aa+'\n') print(channel.recv(9999)) channel.close() client.close()
Отредактировано keepermag (Июль 6, 2023 19:05:12)
Офлайн
keepermagВот твой пример вывода
Имеется следующая проблема:
Вопрос появляется только после ответа, притом на той же строке, что и ответ.
keepermagГде здесь должен появляться вопрос?
Пример вывода:
Host will be turned off.
Are you sure? (Type ‘yes’ to continue) no
Aborted by user
keepermagНикому не интересен твой код и то, как ты там его используешь. Но то, что ты даже объяснить не можешь нихрена, где у тебя и что выводится и не выводится, наводит на мысли, что и код на PyQt5, который ты там написал или где-то взял у кого-то, неправильно работает, потому что ты не можешь сложить два плюс два. Соответственно, если он многопоточный, то при многопоточности проблемы с одновременностью и разновременностью всегда возникают у всех, если не принимать никаких мер, чтобы этого не было. И для этого надо уметь управлять синхронизацией потоков. А чтобы управлять синхронизацией потоков, надо понимать, как она работает, а не просто наугад что-то лепить.
Использую PyQt5 с многопоточностью.
keepermagВсе признаки слабоумия. Что-то типа этого? Что-то типа этого может как рабоать, так и не работать вообще. А с многопоточностью, слепленной наугад, шансы на то, что это не будет работать, только увеличиваются.
Вот, что то типо этого
keepermagСначала ты должен причину определить, а потом уже решать проблему исходя из этой причины. А я пока что вижу, что ты что-то лепишь дальше на чём-то налепленном.
Пока копаю в эту сторону:
keepermagВ каждой из которых может быть ошибка какая-нибудь. Чотко! Молодец! Могёшь! То есть такую маленькую программку ни о чём ты даже не знаешь, как скинуть. Открой для себя архиватор ZIP, облако Google Drive и ещё сервис GitHub.
Весь код скинуть проблематично, более 1000 строк
Отредактировано py.user.next (Июль 6, 2023 20:34:49)
Офлайн
Спасибо за обратную связь, пускай и жесткую. Выкладывать код не могу/не хочу по многим причинам.
В общем то вопрос решён. Пару слов для истории.
Итак, строчка "Are you sure? (Type ‘yes’ to continue) no“ попадала в вывод только полсле того как я отправлял ответ. Ответ - ”no“ - в stdin отправлял с другого потока, до этого эта строчка не отображалась.
На счёт ”воспроизвести проблему", сомнительно, т.к. она проявляется только на одной конкретной модели оборудования.
Решение простое, выводить не так:
stdin, stdout, stderr = client.exec_command('host power off', get_pty=True) for line in stdout: print(line)
channel = client.get_transport().open_session() channel.exec_command('host power off') while 1: line = channel.recv(99999) if len(line) == 0: return else: print(line)
Офлайн