2017-11-21 4 views
1

Ich habe ein Skript in Windows erstellt, um eine Verbindung zum Remote-SSH-Server herzustellen. Ich habe erfolgreich installiert cryptography, pynacl und schließlich paramiko (dauerte einen ganzen Tag, um herauszufinden, wie man sie erfolgreich auf Windows installiert).Python-Kryptografie unter Windows installieren

Nun, da ich das Skript ausführen, erscheint ein Fehler, der besagt, dass das Laden der DLL fehlgeschlagen ist. Der Fehler scheint mit libsodium in Verbindung zu stehen, aber ich kann nicht genau herausfinden, welche DLL zu laden ist und von wo. Um auf der sicheren Seite zu sein, habe ich auch pysodium installiert.

Hier ist das Skript:

automate.py

import SSH 

connection = ssh("10.10.65.100", "gerrit2", "[email protected]") 
print("Calling OpenShell") 
connection.openShell() 
print("Calling sendShell") 
connection.sendShell("ls -l") 
print("Calling process") 
connection.process() 
print("Calling closeConnection") 
connection.closeConnection() 

SSH.py

import threading, paramiko 

class ssh: 
    shell = None 
    client = None 
    transport = None 

    def __init__(self, address, username, password): 
     print("Connecting to server on ip", str(address) + ".") 
     self.client = paramiko.client.SSHClient() 
     self.client.set_missing_host_key_policy(paramiko.client.AutoAddPolicy()) 
     self.client.connect(address, username=username, password=password, look_for_keys=False) 
     self.transport = paramiko.Transport((address, 22)) 
     self.transport.connect(username=username, password=password) 

     thread = threading.Thread(target=self.process) 
     thread.daemon = True 
     thread.start() 

    def closeConnection(self): 
     if(self.client != None): 
      self.client.close() 
      self.transport.close() 

    def openShell(self): 
     self.shell = self.client.invoke_shell() 

    def sendShell(self, command): 
     if(self.shell): 
      self.shell.send(command + "\n") 
     else: 
      print("Shell not opened.") 

    def process(self): 
     global connection 
     while True: 
      # Print data when available 
      if self.shell != None and self.shell.recv_ready(): 
       alldata = self.shell.recv(1024) 
       while self.shell.recv_ready(): 
        alldata += self.shell.recv(1024) 
       strdata = str(alldata, "utf8") 
       strdata.replace('\r', '') 
       print(strdata, end = "") 
       if(strdata.endswith("$ ")): 
        print("\n$ ", end = "") 

Und hier ist der Fehler:

> python automate.py 

Traceback (most recent call last): 
    File "automate.py", line 1, in <module> 
    import SSH 
    File "D:\Automate\SSH_Paramiko\SSH.py", line 1, in <module> 
    import threading, paramiko 
    File "D:\Users\prashant-gu\AppData\Local\Programs\Python\Python37\lib\site-packages\paramiko-2.4.0-py3.7.egg\paramiko\__init__.py", line 22, in <module> 
    File "D:\Users\prashant-gu\AppData\Local\Programs\Python\Python37\lib\site-packages\paramiko-2.4.0-py3.7.egg\paramiko\transport.py", line 57, in <module> 
    File "D:\Users\prashant-gu\AppData\Local\Programs\Python\Python37\lib\site-packages\paramiko-2.4.0-py3.7.egg\paramiko\ed25519key.py", line 22, in <module> 
    File "D:\Users\prashant-gu\AppData\Local\Programs\Python\Python37\lib\site-packages\nacl\signing.py", line 19, in <module> 
    import nacl.bindings 
    File "D:\Users\prashant-gu\AppData\Local\Programs\Python\Python37\lib\site-packages\nacl\bindings\__init__.py", line 17, in <module> 
    from nacl.bindings.crypto_box import (
    File "D:\Users\prashant-gu\AppData\Local\Programs\Python\Python37\lib\site-packages\nacl\bindings\crypto_box.py", line 18, in <module> 
    from nacl._sodium import ffi, lib 
ImportError: DLL load failed: The specified module could not be found. 
+0

Scheint wie * pynacl * nicht installiert ist OK. Eines seiner Erweiterungsmodule (oder einige seiner * .dll * -Abhängigkeiten) kann nicht gefunden werden. Sie sollten in der Lage sein, das Problem einfach zu reproduzieren, indem Sie: "paramiko importieren". BTW: Was ist * Python37 * in deinen Pfaden? – CristiFati

+0

@CristiFati: Ich habe 'where python' und erhielt diesen Pfad' D: \ Benutzer \ prashant-gu \ AppData \ Lokale \ Programme \ Python \ Python37 \ python.exe' –

+0

@CristiFati: Danke für den Hinweis, den Sie mir gegeben haben . Es hat viel Mühe gekostet, aber schließlich ist das Problem gelöst. –

Antwort

0

Nach vielen googeln, ich stolperte schließlich auf this. Wie im Gespräch erwähnte ich meine frühere pynacl Installation deinstalliert, heruntergeladen die komprimierte Quelle von https://github.com/lmctv/pynacl/archive/v1.2.a0.reorder.zip, heruntergeladen libsodium von https://github.com/jedisct1/libsodium/releases/download/1.0.15/libsodium-1.0.15.tar.gz, setzte LIB Umgebungsvariable D:\Users\prashant-gu\Downloads\libsodium-1.0.15\bin\x64\Release\v140\dynamic und schließlich pynacl diese heruntergeladene Quelle Jetzt installiert bilden

pip install .

mit

es funktioniert gut.

Während die Installation von paramiko, ich zufällig auch OpenSSL von https://ci.cryptography.io/job/cryptography-support-jobs/job/openssl-release-1.1/ herunterladen und Satz umfasst Umgebungsvariable D:\Users\prashant-gu\Downloads\openssl-1.1.0g-2015-x86_64\openssl-win64-2015\include um das cryptography Paket erfolgreich zu installieren, die eine Abhängigkeit für paramiko sein geschieht.