Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 6, 2014 00:42:19

GrayShadow
Зарегистрирован: 2014-04-05
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Пошаговый вывод stdout через paramiko

Приветствую, сообщество!
Возник вопрос.
Использую модуль 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)

Офлайн

#2 Апрель 6, 2014 03:06:56

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9849
Репутация: +  853  -
Профиль   Отправить e-mail  

Пошаговый вывод stdout через paramiko

может, так получится (если на той стороне нет блокировки)

for line in stdout:
    print(line)



Отредактировано py.user.next (Апрель 6, 2014 03:08:32)

Офлайн

#3 Апрель 6, 2014 12:29:58

GrayShadow
Зарегистрирован: 2014-04-05
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Пошаговый вывод stdout через paramiko

Да, Спасибо помогло.

Офлайн

#4 Июль 6, 2023 16:09:21

keepermag
Зарегистрирован: 2023-07-06
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Пошаговый вывод stdout через paramiko

Доброго времени суток!
Имеется следующая проблема:
Вопрос появляется только после ответа, притом на той же строке, что и ответ.
Пробовал:
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)

Офлайн

#5 Июль 6, 2023 18:21:51

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9849
Репутация: +  853  -
Профиль   Отправить e-mail  

Пошаговый вывод stdout через paramiko

keepermag
Имеется следующая проблема:
Вопрос появляется только после ответа, притом на той же строке, что и ответ.
Весь код скинь. Используй теги code на форуме.



Офлайн

#6 Июль 6, 2023 19:00:10

keepermag
Зарегистрирован: 2023-07-06
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Пошаговый вывод stdout через paramiko

Весь код скинуть проблематично, более 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)

Офлайн

#7 Июль 6, 2023 20:21:10

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9849
Репутация: +  853  -
Профиль   Отправить e-mail  

Пошаговый вывод stdout через paramiko

keepermag
Имеется следующая проблема:
Вопрос появляется только после ответа, притом на той же строке, что и ответ.
Вот твой пример вывода
keepermag
Пример вывода:
Host will be turned off.
Are you sure? (Type ‘yes’ to continue) no
Aborted by user
Где здесь должен появляться вопрос?
Вроде всё ровно выглядит.

keepermag
Использую PyQt5 с многопоточностью.
Никому не интересен твой код и то, как ты там его используешь. Но то, что ты даже объяснить не можешь нихрена, где у тебя и что выводится и не выводится, наводит на мысли, что и код на PyQt5, который ты там написал или где-то взял у кого-то, неправильно работает, потому что ты не можешь сложить два плюс два. Соответственно, если он многопоточный, то при многопоточности проблемы с одновременностью и разновременностью всегда возникают у всех, если не принимать никаких мер, чтобы этого не было. И для этого надо уметь управлять синхронизацией потоков. А чтобы управлять синхронизацией потоков, надо понимать, как она работает, а не просто наугад что-то лепить.

У тебя не хватило ума даже создать свою тему, а не постить в чужую тему от 2014-го года. Поэтому тебе было сказано “сбрось сюда весь код”, чтобы вместо тебя воспроизвести проблему и понять, в чём она, а ты начал тут рассказывать мол “догадайтесь сами, что я налепил в многопоточной программе, нихрена ни в чём не разбираясь при этом”.

keepermag
Вот, что то типо этого
Все признаки слабоумия. Что-то типа этого? Что-то типа этого может как рабоать, так и не работать вообще. А с многопоточностью, слепленной наугад, шансы на то, что это не будет работать, только увеличиваются.

keepermag
Пока копаю в эту сторону:
Сначала ты должен причину определить, а потом уже решать проблему исходя из этой причины. А я пока что вижу, что ты что-то лепишь дальше на чём-то налепленном.

keepermag
Весь код скинуть проблематично, более 1000 строк
В каждой из которых может быть ошибка какая-нибудь. Чотко! Молодец! Могёшь! То есть такую маленькую программку ни о чём ты даже не знаешь, как скинуть. Открой для себя архиватор ZIP, облако Google Drive и ещё сервис GitHub.



Отредактировано py.user.next (Июль 6, 2023 20:34:49)

Офлайн

#8 Июль 6, 2023 23:06:41

keepermag
Зарегистрирован: 2023-07-06
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Пошаговый вывод stdout через paramiko

Спасибо за обратную связь, пускай и жесткую. Выкладывать код не могу/не хочу по многим причинам.
В общем то вопрос решён. Пару слов для истории.
Итак, строчка "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)

Просто пытался найти другой способ, но уж сделал как сделал.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version