Paramiko `exec_command` timeout работает только для короткого времени ожидания, а тип исключения не совпадает - PullRequest
1 голос
/ 10 мая 2019

Мой сценарий Python выполняет удаленную команду через ssh, используя функцию exec_command библиотеки Paramiko.Чтобы проверить параметр timeout этой команды, я отправляю цикл бездействия и проверяю, что функция exec_command отключена.Однако тайм-аут срабатывает только тогда, когда я установил его на значение меньше 1.Например, следующий код истекает, как и ожидалось:

command = 'while true; do :; done'
ssh = paramiko.SSHClient()
ssh.connect(ip, port=port, username=user, pkey=key, timeout=10)
_, stdout, stderr = ssh.exec_command(command, timeout=0.5)
print("Running command: {}".format(command))
exit_code = stdout.channel.recv_exit_status()

Но когда я изменяю значение аргумента timeout на 1, он не истекает.

Еще одна странная вещьявляется то, что когда тайм-аут действительно происходит (со значением 0.5 arg), тип исключения - paramiko.ssh_exception.SSHException, а не socket.timeout, как утверждают документы.Полное сообщение об исключении: paramiko.ssh_exception.SSHException: Timeout openning channel. Но трассировка стека начинается с строки exec_command выше, а не с строки connect:

Running command: while true; do :; done
Traceback (most recent call last):
  File "./t.py", line 40, in <module>
    _, stdout, stderr = ssh.exec_command(command, timeout=0.5)
  File "/usr/lib/python3/dist-packages/paramiko/client.py", line 414, in exec_command
    chan = self._transport.open_session(timeout=timeout)
  File "/usr/lib/python3/dist-packages/paramiko/transport.py", line 703, in open_session
    timeout=timeout)
  File "/usr/lib/python3/dist-packages/paramiko/transport.py", line 828, in open_channel
    raise SSHException('Timeout openning channel.')
paramiko.ssh_exception.SSHException: Timeout openning channel.

Итак, у меня два вопроса:

  • Почему тайм-аут 0.5 работает, а 1 или выше -
  • Почему исключение сообщает об истечении времени ожидания открытия канала вместо socket.timeout, даже если исключениеиз exec_command, а не connect?

Любая помощь приветствуется!

1 Ответ

1 голос
/ 13 мая 2019

Аргумент timeout SSHClient.exec_command имеет две цели:

  • Ограничение по времени для открытия канала SSH "exec".

    Здесь, вероятно, срабатывает тайм-аут на 0,5 с, так как открытие канала на вашем сервере занимает больше времени. То есть Тайм-аут не имеет ничего общего с вашей бесконечной командой.

    Если вы установите более длительное время ожидания (1 с), канал удастся открыть.

    Это действительно выдает SSHException ( "Тайм-аут открытия канала." ).

  • Ограничение по времени для операций блокировки, таких как чтение / запись. Вы не занимаетесь чтением / письмом. Это бросило бы socket.timeout.

    Channel.recv_exit_status, похоже, не использует timeout. Он ждет вечно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...