2021年12月7日 星期二

Python 學習筆記 : paramiko 的 Error reading SSH protocol banner'utf-8' 問題

很久以前有用 Paramiko 套件測試過連線遠端樹莓派, 參考 : 


簡單測試成功後就收兵, 但今天為了工作上的自動化抽空使用 Paramiko 套件連線遠端主機卻時遇到 Error reading SSH protocol banner'utf-8' 問題 :

>>> import paramiko     
>>> client=paramiko.SSHClient()      
>>> client.load_system_host_keys()    
>>> client.connect('192.168.70.11', '2361', 'iamyesman', '1234567')         
Exception: Error reading SSH protocol banner'utf-8' codec can't decode byte 0xff in position 0: invalid start byte
Traceback (most recent call last):
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\site-packages\paramiko\transport.py", line 2211, in _check_banner
    try:
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\site-packages\paramiko\packet.py", line 386, in readline
    return u(buf)
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\site-packages\paramiko\py3compat.py", line 147, in u
    return s.decode(encoding)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\site-packages\paramiko\transport.py", line 2039, in run
    self._check_banner()
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\site-packages\paramiko\transport.py", line 2216, in _check_banner
    raise SSHException(
paramiko.ssh_exception.SSHException: Error reading SSH protocol banner'utf-8' codec can't decode byte 0xff in position 0: invalid start byte

Traceback (most recent call last):
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\site-packages\paramiko\transport.py", line 2211, in _check_banner
    try:
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\site-packages\paramiko\packet.py", line 386, in readline
    return u(buf)
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\site-packages\paramiko\py3compat.py", line 147, in u
    return s.decode(encoding)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<pyshell>", line 1, in <module>
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\site-packages\paramiko\client.py", line 406, in connect
    t.start_client(timeout=timeout)
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\site-packages\paramiko\transport.py", line 660, in start_client
    raise e
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\site-packages\paramiko\transport.py", line 2039, in run
    self._check_banner()
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\site-packages\paramiko\transport.py", line 2216, in _check_banner
    raise SSHException(
paramiko.ssh_exception.SSHException: Error reading SSH protocol banner'utf-8' codec can't decode byte 0xff in position 0: invalid start byte

我在 Stackoverflow 找到下面這兩篇 : 


照底下解答似乎是 Paramiko 底下有一個 Transport.py 檔案裡面的 timeout 設太小 (預設值是 self.banner_timeout=15), 答者建議直接加一列指令 timeout=200 固定此值即可, 首先用 __file__ 屬性找出 paramiko 位置 : 

>>> paramiko.__file__     
'C:\\Users\\User\\AppData\\Local\\Programs\\Thonny\\lib\\site-packages\\paramiko\\__init__.py'

到 Thonny 底下的 lib\site-packages\paramiko 即可找到 Transport.py :  




但是我修改 Transport.py 後執行 SSH 連線錯誤依舊, 無效. 找了很多文章都無法解決, 所以先做個紀錄暫時擱下, 也許明天可以考慮改用 netmiko 看看. 

參考 :



2023-06-14 補充 :

最近突然發現, 搞了老半天是我搞錯了, 原來我要連線的主機不是使用 ssh 協定, 而是使用 telnet, 難怪 Paramiko 會出現這個怪問題, 收隊. 

沒有留言 :