Как заставить скрипт ждать не блокируя программу и ещё кое что
Всем привет. Я новичок в питон и пока не всё понимаю но пытаюсь разобраться. Суть проблемы вот в чём: есть несколько устройств с которых нужно получать информацию по SSH, условно будет говорить что надо получить серийный номер. Есть скрипт:
import asyncio
import asyncssh
import sys
class MySSHClientSession(asyncssh.SSHClientSession):
def data_received(self, data, datatype):
print(data, end='')
def connection_lost(self, exc):
if exc:
print(f'SSH session error: {str(exc)}', file=sys.stderr)
async def getserial(ipaddress, user, password):
conn, client = await asyncssh.create_connection(asyncssh.SSHClient, host=ipaddress, username=user, password=password, known_hosts=None)
async with conn:
chan, session = await conn.create_session(MySSHClientSession, 'show device serial')
await chan.wait_closed()
async def main(data):
futures = [
getserial(ipaddress=data[0]['ip_oam'], user=data[0]['login'], password=data[0]['cli_password']),
getserial(ipaddress=data[1]['ip_oam'], user=data[1]['login'], password=data[1]['cli_password']),
]
wait_task = await asyncio.gather(*futures)
if __name__ == '__main__':
devlist = {
0: {'ip_oam': '192.168.1.5', 'login': 'root','cli_password': '123123'},
1: {'ip_oam': '192.168.1.51', 'login': 'root','cli_password': '321321'},
}
try:
loop = asyncio.get_event_loop()
result = loop.run_until_complete(main(devlist))
except(OSError, asyncssh.Error) as exc:
sys.exit(f'SSH connect failed: {str(exc)}')
Несколько вопросов. Аппаратура на которую скрипт делает запрос очень специфическая и после входа по ssh есть задержка от 5 до 7 секунд в момент которой терминал просто ничего не делает, а потом выходит приглашение в которое можно будет вводить команды. Если не делать задержку в этот момент, а сразу вводить команды то устройство их просто проигнорирует. Именно так было в варианте с paramiko, там приходится делать time.sleep. Как сделать это в асинхронном варианте скрипта с asyncssh?
Как вывести переменную data в которой хранится вывод запроса ssh в main чтобы дальше использовать этот вывод и парсить ответ от устройства?
Спасибо.
Ответы (1 шт):
Поспать
await asyncio.sleep(7)
но так как штука у нас асинхронная - повесь колбэк на сессию и жди там приглашения от железки. на сессию в инит повесь экземляр self.ready = asyncio.Future() и в колбэке self.ready.set_result(True), ну и потом..
Надо будет перечитать доки, чтоб написать подробнее...