Отправка сообщений keep alive на хост после перезагрузки хоста - paramiko - PullRequest
0 голосов
/ 18 июня 2020

Я использую paramiko для подключения к моему хосту (серверу).
Теперь я использую paramiko.set_keepalive для отправки моему серверу keep alive сообщений, которые должны проверять соединение с хостом и для предотвращения тайм-аута .
Теперь я увидел, что он просто отправляет глобальный запрос без каких-либо данных и без ожидания ответа от server.
(global_request("keepalive@lag.net", wait=False) - код paramiko)

Теперь,
Когда я перезагружаю свой хост-сервер, это создает проблему.
Эти сохраняют в живых пакетов просто отправляются на хост, не дожидаясь ответа, и поскольку хост мертв (после перезагрузки), отправка и получение вывода любой команды на хост с использованием некоторого канала (paramiko.Channel), который был открыт до перезагрузки, хост-сервер просто зависает пока не будет выполнена перезагрузка хоста (иногда это занимает ~ 6 минут).
Мое мнение: Вероятно, это связано с тем, что этот paramiko.Channel не знает, что соединение с хостом разорвано.

Кстати, когда он в конечном итоге выходит из строя, я получаю сообщение EOF in transport thread в моем paramiko журнале или Socket exception: Connection reset by peer (104) сообщение об исключении.

Я добавляю несколько журналов, которые демонстрируют эту проблему:

2020-06-18 15:18:45.656 [DEBUG] [infra.utils.dataframe:109] 
+-----------+----------------+---------------------+-------------------+-----------+---------+---------+---------+---------+---------+
| (VC:VS)   | MAC            | IP                  | VERSION           | STATUS    | CLOCK   |   DS RF |   US RF |   DS CH |   US CH |
|-----------+----------------+---------------------+-------------------+-----------+---------+---------+---------+---------+---------|
| 1:0       | 0020.a324.7153 | 3000:200:200:57::50 | 1.13.0.0-1+auto29 | configure | locked  |       1 |       2 |     158 |      12 |
| 2:0       | 0020.a32b.005b | 3000:200:200:57::49 | 1.13.0.0-1+auto29 | configure | locked  |       1 |       2 |     158 |      12 |
+-----------+----------------+---------------------+-------------------+-----------+---------+---------+---------+---------+---------+ 
2020-06-18 15:18:45.704 [DEBUG] [infra.Interfaces.Cli.core_cli_interface:287] [Device: CableOsCore] [CLI 10.40.5.203:22057] Received 'show cable rpd | nomore' dataframe:     MAC             IP                   VERSION            STATUS     CLOCK      DS RF    US RF    DS CH    US CH
---  --------------  -------------------  -----------------  ---------  -------  -------  -------  -------  -------
1:0  0020.a324.7153  3000:200:200:57::50  1.13.0.0-1+auto29  configure  locked         1        2      158       12
2:0  0020.a32b.005b  3000:200:200:57::49  1.13.0.0-1+auto29  configure  locked         1        2      158       12 
2020-06-18 15:19:15.341 [DEBUG] [paramiko.transport:1819] Sending global request "keepalive@lag.net" 
2020-06-18 15:19:16.700 [DEBUG] [paramiko.transport:1819] Sending global request "keepalive@lag.net" 
2020-06-18 15:19:16.704 [DEBUG] [infra.Interfaces.Cli.cli_interface:60] [Device: CableOsCore] [CLI 10.40.5.203:22057] Trying to open connection to CableOsCore CLI interface... 
2020-06-18 15:19:40.609 [DEBUG] [paramiko.transport:1819] Sending global request "keepalive@lag.net" 
2020-06-18 15:19:46.793 [DEBUG] [paramiko.transport:1819] Sending global request "keepalive@lag.net" 
2020-06-18 15:20:10.675 [DEBUG] [paramiko.transport:1819] Sending global request "keepalive@lag.net" 
2020-06-18 15:20:16.839 [DEBUG] [paramiko.transport:1819] Sending global request "keepalive@lag.net" 
2020-06-18 15:20:40.742 [DEBUG] [paramiko.transport:1819] Sending global request "keepalive@lag.net" 
2020-06-18 15:20:46.920 [DEBUG] [paramiko.transport:1819] Sending global request "keepalive@lag.net" 
2020-06-18 15:21:10.789 [DEBUG] [paramiko.transport:1819] Sending global request "keepalive@lag.net" 
2020-06-18 15:21:16.981 [DEBUG] [paramiko.transport:1819] Sending global request "keepalive@lag.net" 
2020-06-18 15:21:40.847 [DEBUG] [paramiko.transport:1819] Sending global request "keepalive@lag.net" 
2020-06-18 15:21:47.052 [DEBUG] [paramiko.transport:1819] Sending global request "keepalive@lag.net" 
2020-06-18 15:22:10.916 [DEBUG] [paramiko.transport:1819] Sending global request "keepalive@lag.net" 
2020-06-18 15:22:17.125 [DEBUG] [paramiko.transport:1819] Sending global request "keepalive@lag.net" 
2020-06-18 15:22:40.965 [DEBUG] [paramiko.transport:1819] Sending global request "keepalive@lag.net" 
2020-06-18 15:22:47.196 [DEBUG] [paramiko.transport:1819] Sending global request "keepalive@lag.net" 
2020-06-18 15:23:11.013 [DEBUG] [paramiko.transport:1819] Sending global request "keepalive@lag.net" 
2020-06-18 15:23:17.252 [DEBUG] [paramiko.transport:1819] Sending global request "keepalive@lag.net" 
2020-06-18 15:23:41.056 [DEBUG] [paramiko.transport:1819] Sending global request "keepalive@lag.net" 
2020-06-18 15:23:47.303 [DEBUG] [paramiko.transport:1819] Sending global request "keepalive@lag.net" 
2020-06-18 15:24:11.112 [DEBUG] [paramiko.transport:1819] Sending global request "keepalive@lag.net" 
2020-06-18 15:24:17.343 [DEBUG] [paramiko.transport:1819] Sending global request "keepalive@lag.net" 
2020-06-18 15:24:41.179 [DEBUG] [paramiko.transport:1819] Sending global request "keepalive@lag.net" 
2020-06-18 15:24:47.396 [DEBUG] [paramiko.transport:1819] Sending global request "keepalive@lag.net" 
2020-06-18 15:25:11.241 [DEBUG] [paramiko.transport:1819] Sending global request "keepalive@lag.net" 
2020-06-18 15:25:17.473 [DEBUG] [paramiko.transport:1819] Sending global request "keepalive@lag.net" 
2020-06-18 15:25:41.299 [DEBUG] [paramiko.transport:1819] Sending global request "keepalive@lag.net" 
2020-06-18 15:25:47.530 [DEBUG] [paramiko.transport:1819] Sending global request "keepalive@lag.net" 
2020-06-18 15:26:11.366 [DEBUG] [paramiko.transport:1819] Sending global request "keepalive@lag.net" 
2020-06-18 15:26:17.598 [DEBUG] [paramiko.transport:1819] Sending global request "keepalive@lag.net" 
2020-06-18 15:26:35.107 [ERROR] [paramiko.transport:1819] Socket exception: Connection reset by peer (104) 
2020-06-18 15:26:35.113 [DEBUG] [BEAF::SshExecutor:91] SshInteractiveShell shell channel isn't active... 
2020-06-18 15:26:35.114 [DEBUG] [BEAF::SshExecutor:118] [admin@10.40.5.203:22057] SSH connection to 10.40.5.203 isn't active... 
2020-06-18 15:26:35.117 [DEBUG] [BEAF::SshExecutor:495] [admin@10.40.5.203:22057] Closing SSH connection... 
2020-06-18 15:26:35.123 [DEBUG] [BEAF::SshExecutor:425] [admin@10.40.5.203:22057] Closing interactive shell... 
2020-06-18 15:26:35.126 [DEBUG] [BEAF::SshExecutor:433] [admin@10.40.5.203:22057] interactive shell channel was closed 
2020-06-18 15:26:35.128 [DEBUG] [BEAF::SshExecutor:503] [admin@10.40.5.203:22057] SSH connection is closed 
2020-06-18 15:26:35.294 [DEBUG] [BEAF::SshExecutor:219] [admin@10.40.5.203:22057] Opening SSH connection... 
2020-06-18 15:26:35.462 [DEBUG] [BEAF::SshExecutor:234] [admin@10.40.5.203:22057] Authentication type chosen: (password) 
2020-06-18 15:26:35.636 [DEBUG] [paramiko.transport:1819] starting thread (client mode): 0x9367c978 
2020-06-18 15:26:35.639 [DEBUG] [paramiko.transport:1819] Local version/idstring: SSH-2.0-paramiko_2.6.0 
2020-06-18 15:26:35.798 [DEBUG] [paramiko.transport:1819] Remote version/idstring: SSH-2.0-ConfD-6.0 
2020-06-18 15:26:35.804 [INFO] [paramiko.transport:1819] Connected (version 2.0, client ConfD-6.0) 
2020-06-18 15:26:35.964 [DEBUG] [paramiko.transport:1819] kex algos:['diffie-hellman-group14-sha1', 'diffie-hellman-group1-sha1'] server key:['ssh-rsa', 'ssh-dss'] client encrypt:['aes128-ctr', 'aes192-ctr', 'aes256-ctr', 'aes128-cbc', 'aes256-cbc', '3des-cbc'] server encrypt:['aes128-ctr', 'aes192-ctr', 'aes256-ctr', 'aes128-cbc', 'aes256-cbc', '3des-cbc'] client mac:['hmac-md5', 'hmac-sha1', 'hmac-sha2-256', 'hmac-sha2-512', 'hmac-sha1-96', 'hmac-md5-96'] server mac:['hmac-md5', 'hmac-sha1', 'hmac-sha2-256', 'hmac-sha2-512', 'hmac-sha1-96', 'hmac-md5-96'] client compress:['none', 'zlib'] server compress:['none', 'zlib'] client lang:[''] server lang:[''] kex follows?False 
2020-06-18 15:26:35.966 [DEBUG] [paramiko.transport:1819] Kex agreed: diffie-hellman-group14-sha1 
2020-06-18 15:26:35.968 [DEBUG] [paramiko.transport:1819] HostKey agreed: ssh-rsa 
2020-06-18 15:26:35.970 [DEBUG] [paramiko.transport:1819] Cipher agreed: aes128-ctr 
2020-06-18 15:26:35.972 [DEBUG] [paramiko.transport:1819] MAC agreed: hmac-sha2-256 
2020-06-18 15:26:35.974 [DEBUG] [paramiko.transport:1819] Compression agreed: none 
2020-06-18 15:26:36.189 [DEBUG] [paramiko.transport:1819] kex engine KexGroup14 specified hash_algo <built-in function openssl_sha1> 
2020-06-18 15:26:36.354 [DEBUG] [paramiko.transport:1819] Switch to new keys ... 
2020-06-18 15:26:36.367 [DEBUG] [paramiko.transport:1819] Adding ssh-rsa host key for [10.40.5.203]:22057: b'9e2251634f7ac1355bd6a05d3798f8d5' 
2020-06-18 15:26:36.539 [DEBUG] [paramiko.transport:1819] userauth is OK 
2020-06-18 15:26:36.709 [INFO] [paramiko.transport:1819] Auth banner: b'Welcome\nMy very important MessageMy very important login banner\n' 

После получения этой строки я перезагрузил свой хост:

2:0  0020.a32b.005b  3000:200:200:57::49  1.13.0.0-1+auto29  configure  locked         1        2      158       12 

Теперь
Я попытался использовать global_request("keepalive@lag.net", wait=True), чтобы увидеть, что происходит, и получил следующую ошибку сообщение в моих журналах: Global request denied. paramiko, а возвращаемый объект был None.

Итак, мой вопрос:
Есть ли встроенные функции paramiko ?? или я должен открыть новый канал для того же хоста, который будет в отдельном потоке и будет время от времени отправлять пустое сообщение (\n) хосту и ждать ответа от него (я предпочитаю использовать другой механизм, если нет нет другого решения).

Майкл

...