Мой сценарий 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
?
Любая помощь приветствуется!