Python: модуль paramiko — NameError: global name ‘descriptor’ is not defined

Автор: | 06/13/2015
 

Pythonparamiko установлен из исходных кодов, загруженных с официального репозитория.

При выполнении подключения — возникает ошибка:

NameError: global name ‘descriptor’ is not defined

Например:

>>> import paramiko
>>> ssh = paramiko.SSHClient()
>>> ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
>>> ssh.connect('54.***.***.110', username='username', key_filename='D:KeysMyOWNsetevoy_priv.ppk')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "buildbdist.win32eggparamikoclient.py", line 366, in connect
  File "buildbdist.win32eggparamikoclient.py", line 515, in _auth
  File "buildbdist.win32eggparamikoagent.py", line 343, in __init__
  File "buildbdist.win32eggparamikoagent.py", line 66, in _connect
  File "buildbdist.win32eggparamikoagent.py", line 83, in _send_message
  File "buildbdist.win32eggparamikowin_pageant.py", line 123, in send
  File "buildbdist.win32eggparamikowin_pageant.py", line 89, in _query_pageant
  File "buildbdist.win32eggparamiko_winapi.py", line 273, in get_security_attributes_for_user
  File "buildbdist.win32eggparamiko_winapi.py", line 223, in descriptor
NameError: global name 'descriptor' is not defined

Для решения — отредактируйте файл paramiko-masterbuildlibparamiko_winapi.py из загруженной копии, и в строках 222 и 223 замените:

    @descriptor.setter
    def descriptor(self, value):
        self._descriptor = descriptor
        self.lpSecurityDescriptor = ctypes.addressof(descriptor)

На:

    @descriptor.setter
    def descriptor(self, value):
        self._descriptor = value
        self.lpSecurityDescriptor = ctypes.addressof(value)

Удалите egg-файл:

> rm C:Python27Libsite-packagesparamiko-1.16.0-py2.7.egg

Переустановите paramiko:

C:[...]paramiko-master>easy_install ./
Processing
Writing C:[...]paramiko-mastersetup.cfg
Running setup.py -q bdist_egg --dist-dir C:[...]paramiko-masteregg-dist-tmp-6bh7ih
warning: no files found matching '*' under directory 'docs'
zip_safe flag not set; analyzing archive contents...
Adding paramiko 1.16.0 to easy-install.pth file

Installed c:python27libsite-packagesparamiko-1.16.0-py2.7.egg
Processing dependencies for paramiko==1.16.0
Finished processing dependencies for paramiko==1.16.0

Готово:

>>> import paramiko
>>> ssh = paramiko.SSHClient()
>>> ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
>>> ssh.connect('54.***.***.110', username='username', key_filename='D:KeysMyOWNsetevoy_priv.ppk')
>>> stdin, stdout, stderr = ssh.exec_command("uptime")
>>> print stdout.channel.recv_exit_status()
0