Python代码在Python Shell正常但VSCode中连接Juniper设备触发NetmikoTimeoutException
解决Netmiko连接Juniper设备在VSCode中超时的问题
问题场景
我使用以下代码连接Juniper设备:
virtual_srx = { 'device_type': 'juniper', 'host': '192.168.0.140', 'username': 'root', 'password': 'Aa123456', 'secret': '', 'port' : 22, } ssh = ConnectHandler(**virtual_srx)
这段代码在Python Shell中运行完全正常,但在VSCode中执行时触发NetmikoTimeoutException,错误栈如下:
Traceback (most recent call last): File "/home/ubuntu/PycharmProjects/pythonProject/venv/lib/python3.8/site-packages/paramiko/channel.py", line 699, in recv out = self.in_buffer.read(nbytes, self.timeout) File "/home/ubuntu/PycharmProjects/pythonProject/venv/lib/python3.8/site-packages/paramiko/buffered_pipe.py", line 164, in read raise PipeTimeout() paramiko.buffered_pipe.PipeTimeout During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/ubuntu/PycharmProjects/pythonProject/venv/lib/python3.8/site-packages/netmiko/base_connection.py", line 573, in _read_channel_expect new_data = self.remote_conn.recv(MAX_BUFFER) File "/home/ubuntu/PycharmProjects/pythonProject/venv/lib/python3.8/site-packages/paramiko/channel.py", line 701, in recv raise socket.timeout() socket.timeout During handling of the above exception, another exception occurred: Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/home/ubuntu/PycharmProjects/pythonProject/venv/lib/python3.8/site-packages/netmiko/ssh_dispatcher.py", line 326, in ConnectHandler return ConnectionClass(*args, **kwargs) File "/home/ubuntu/PycharmProjects/pythonProject/venv/lib/python3.8/site-packages/netmiko/juniper/juniper.py", line 20, in __init__ return super().__init__(*args, **kwargs) File "/home/ubuntu/PycharmProjects/pythonProject/venv/lib/python3.8/site-packages/netmiko/base_connection.py", line 350, in __init__ self._open() File "/home/ubuntu/PycharmProjects/pythonProject/venv/lib/python3.8/site-packages/netmiko/base_connection.py", line 356, in _open self._try_session_preparation() File "/home/ubuntu/PycharmProjects/pythonProject/venv/lib/python3.8/site-packages/netmiko/base_connection.py", line 792, in _try_session_preparation self.session_preparation() File "/home/ubuntu/PycharmProjects/pythonProject/venv/lib/python3.8/site-packages/netmiko/juniper/juniper.py", line 26, in session_preparation self.set_terminal_width(command=cmd, pattern=r"Screen width set to") File "/home/ubuntu/PycharmProjects/pythonProject/venv/lib/python3.8/site-packages/netmiko/base_connection.py", line 1131, in set_terminal_width output = self.read_until_pattern(pattern=pattern) File "/home/ubuntu/PycharmProjects/pythonProject/venv/lib/python3.8/site-packages/netmiko/base_connection.py", line 655, in read_until_pattern return self._read_channel_expect(*args, **kwargs) File "/home/ubuntu/PycharmProjects/pythonProject/venv/lib/python3.8/site-packages/netmiko/base_connection.py", line 583, in _read_channel_expect raise NetmikoTimeoutException( netmiko.ssh_exception.NetmikoTimeoutException: Timed-out reading channel, data not available.
已确认设备IP可正常ping通,且VSCode中用Netmiko连接其他设备无异常。
解决思路
从错误栈可以看出,问题出在会话准备阶段的终端宽度设置步骤,结合VSCode与Python Shell的环境差异,可尝试以下方案:
延长超时时间
VSCode终端的交互响应速度可能慢于Python Shell,给Netmiko增加超时参数:virtual_srx = { 'device_type': 'juniper', 'host': '192.168.0.140', 'username': 'root', 'password': 'Aa123456', 'secret': '', 'port' : 22, 'timeout': 60, # 从默认10秒延长至60秒 'session_timeout': 60 }跳过终端宽度设置
部分Juniper设备不会返回Netmiko预期的"Screen width set to"字符串,可自定义连接类跳过该步骤:from netmiko.juniper.juniper import JuniperSSH class CustomJuniperSSH(JuniperSSH): def session_preparation(self): self._test_channel_read() self.set_base_prompt() # 注释掉原有的终端宽度设置逻辑 # self.set_terminal_width(command=cmd, pattern=r"Screen width set to") self.disable_paging() # 使用自定义类建立连接 ssh = CustomJuniperSSH(**virtual_srx)检查VSCode终端环境
尝试切换VSCode的终端类型(如从bash切换到zsh,或使用集成终端替代外部终端),也可关闭命令执行结果验证:virtual_srx['global_cmd_verify'] = False手动验证SSH交互
在VSCode终端中执行ssh root@192.168.0.140,检查是否有首次连接的密钥确认、自定义横幅等额外交互,这类场景可通过增加banner_timeout参数或提前处理密钥解决。
内容的提问来源于stack exchange,提问作者kfirwe
相关产品推荐
相关产品推荐

