Hallo,
gibt es in Python die Möglichkeit, Daten per SFTP über SSH2 (SecureFTP) oder SCP (Secure Copy) zu senden bzw. zu empfangen?
Stephan
Python und SecureFTP
Nein leider nicht, steht aber mit ganz oben auf meiner TODO Liste.
fs111
fs111
- Mawilo
- User
- Beiträge: 452
- Registriert: Sonntag 22. Februar 2004, 10:58
- Wohnort: Sachsen
- Kontaktdaten:
Hi,
ich habe mal gegoogelt und eine eine Seite gefunden, die ich interessant finde.
http://www-106.ibm.com/developerworks/l ... wist4.html
Ich bin aber schon beim Installieren der notwendigen Module abgestorben. Ich bekomme beim Compilieren von pycrypto mit MinGW immer eine Fehlermeldung:
error: command 'gcc' failed with exit status 1
ich habe mal gegoogelt und eine eine Seite gefunden, die ich interessant finde.
http://www-106.ibm.com/developerworks/l ... wist4.html
Ich bin aber schon beim Installieren der notwendigen Module abgestorben. Ich bekomme beim Compilieren von pycrypto mit MinGW immer eine Fehlermeldung:
error: command 'gcc' failed with exit status 1
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Hab was gefunden: http://www.lag.net/paramiko/ aber dafür benötigt man das Python Cryptography Toolkit und das gibt es noch nicht für Python 2.4
s. "Suche: PyCrypto für Python 2.4" http://python.sandtner.org/viewtopic.php?t=2553
s. "Suche: PyCrypto für Python 2.4" http://python.sandtner.org/viewtopic.php?t=2553
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Vielleicht hast du ja kein libssl-dev installiert. Hier gibt es meine MinGW Binaries und Twisted habe ich auch fast fertig.Stephan hat geschrieben:Ich bin aber schon beim Installieren der notwendigen Module abgestorben. Ich bekomme beim Compilieren von pycrypto mit MinGW immer eine Fehlermeldung:
error: command 'gcc' failed with exit status 1
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Super vielen Dank für deine Binaries!!! Sollte man einen Link auf die Python.org Seite machen
Hab mal http://python.sandtner.org/viewtopic.php?p=14112 gemacht
Aber zurück zum sFTP:
Leider bekomme ich immer einen Traceback, das die Authorisierung fehlgeschlagen ist:
Leider weiß ich nicht, wie ich mehr Details beim Connecten Abfragen kann...
Hab mal http://python.sandtner.org/viewtopic.php?p=14112 gemacht
Aber zurück zum sFTP:
Code: Alles auswählen
import paramiko
ServerAdr="[i]ServerAdr.de[/i]:22"
print "Transport ",ServerAdr,"...",
t = paramiko.Transport( ServerAdr )
print "OK"
print "Connect...",
t.connect(None, "[i]UserName[/i]", "[i]PassWort[/i]", None)
print "OK"
sftp = paramiko.SFTP.from_transport(t)
print sftp.listdir("./")
sftp.close()
t.close()
Code: Alles auswählen
Traceback (most recent call last):
File "sftp01.py", line 12, in ?
t.connect(None, "XXX", "XXX", None)
File "D:\Python\Python24\lib\site-packages\paramiko\transport.py", line 763, in connect
self.auth_password(username, password)
File "D:\Python\Python24\lib\site-packages\paramiko\auth_transport.py", line 215, in auth_password
return self._wait_for_response(my_event)
File "D:\Python\Python24\lib\site-packages\paramiko\auth_transport.py", line 275, in _wait_for_response
raise e
paramiko.ssh_exception.SSHException: Authentication failed.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Kannst ja dort ins Wiki schreiben.jens hat geschrieben:Super vielen Dank für deine Binaries!!! Sollte man einen Link auf die Python.org Seite machen
Ich würde es so wie in der README machen:jens hat geschrieben:Aber zurück zum sFTP:
Leider weiß ich nicht, wie ich mehr Details beim Connecten Abfragen kann...Code: Alles auswählen
import paramiko ServerAdr="[i]ServerAdr.de[/i]:22" print "Transport ",ServerAdr,"...", t = paramiko.Transport( ServerAdr ) print "OK" print "Connect...", t.connect(None, "[i]UserName[/i]", "[i]PassWort[/i]", None) print "OK" sftp = paramiko.SFTP.from_transport(t) print sftp.listdir("./") sftp.close() t.close()
Code: Alles auswählen
t.connect(username="[i]UserName[/i]", password="[i]PassWort[/i]")
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Jep! Das sieht besser aus Leider funktioniert das aber genauso wenigLeonidas hat geschrieben:Ich würde es so wie in der README machen:Code: Alles auswählen
t.connect(username="[i]UserName[/i]", password="[i]PassWort[/i]")
Hast du selber schon mal eine Verbindung zu einem SFTP Server hinbekommen???
Hab noch ein paar Beispiele gefunden:
http://cs.usfca.edu/~afedosov/netgreg/cgi-bin/ssh.py
http://www.bitpim.org/pyxr/c/projects/b ... ff.py.html
Hilft mir aber auch nicht weiter
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Hab hier mal versucht die ganze Sacher ohne das "vorgefertigte" connect zu benutzen, um zu sehen, wodrann der Connect scheitert... Hab mich an den Beispielen gehalten:
Die Ausgabe:
Er mekert das keine Session existiert... aber t.open_session() kommt eigentlich erst nach der Authorisation... Hab versuchsweise mal davor gemacht: Dann erhalte ich den Fehler No handlers could be found for logger "paramiko.transport" Danach bleibt das Programm einige Zeit hängen... Aber es geht weiter mit der Authorisation mit wieder dem selben Fehler "No existing Session"...
Code: Alles auswählen
import sys, socket
import paramiko
ServerAdr = "[i]ServerAdr.de[/i]"
ServerPort = 22
User = "[i]XXX[/i]"
Pass = "[i]XXX[/i]"
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect( (ServerAdr, ServerPort) )
print "Transport",ServerAdr,"...",
t = paramiko.Transport( sock )
print "OK",t
t._log(9,"D:\\temp\\paramiko.log")
print "start client...",
t.start_client()
print "OK",t
print "-"*80
print "isAlive:",t.isAlive()
print "isDaemon:",t.isDaemon()
print "is_active:",t.is_active()
print "is_authenticated:",t.is_authenticated()
print "-"*80
print "auth_password...",
t.auth_password( username=User, password=Pass )
print "OK"
print "open session...",
session = t.open_session()
print "OK"
Code: Alles auswählen
Transport ServerAdr.de ... OK <paramiko.Transport at 0x9d1dd0 (unconnected)>
start client... OK <paramiko.Transport at 0x9d1dd0 (connecting)>
--------------------------------------------------------------------------------
isAlive: True
isDaemon: False
is_active: True
is_authenticated: False
--------------------------------------------------------------------------------
auth_password...
Traceback (most recent call last):
File "sftp02.py", line 37, in ?
t.auth_password( username=User, password=Pass )
File "D:\Python\Python24\lib\site-packages\paramiko\auth_transport.py", line 198, in auth_password
raise SSHException('No existing session')
paramiko.ssh_exception.SSHException: No existing session
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Code: Alles auswählen
import paramiko
t = paramiko.Transport("192.168.123.2")
t.connect(username="marek", password="andernmal")
sftp = paramiko.SFTP.from_transport(t)
print sftp.listdir("./")
t.close()
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Also ich hab zwei Server mit den ich es testen kann... Und ich kann eine Verbindung mir FileZilla und dem User/Passwort aufbauen...
Der eine Server ist vom Typ "SFTP über SSH2", bei dem bekomme ich SSHException: Authentication failed
Der andere Server ist vom Typ "FTP über SSL (Explizite Verschlüsselung)" und damit bekomme ich nach einiger Wartezeit auch einen Fehler:
Bei beiden Servern habe ich passiver Modus in FileZilla gewählt...
Welche Server Einstellungen hast du denn?
Der eine Server ist vom Typ "SFTP über SSH2", bei dem bekomme ich SSHException: Authentication failed
Der andere Server ist vom Typ "FTP über SSL (Explizite Verschlüsselung)" und damit bekomme ich nach einiger Wartezeit auch einen Fehler:
Code: Alles auswählen
Traceback (most recent call last):
File "sftp02.py", line 22, in ?
t.connect(username=User, password=Pass)
File "D:\Python\Python24\lib\site-packages\paramiko\transport.py", line 745, in connect
raise e
EOFError
Welche Server Einstellungen hast du denn?
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Hab gerade eine LOG-Funktion entdeckt!!!
Hier die LOG Datei beim Server mit dem paramiko.ssh_exception.SSHException: Authentication failed.
Code: Alles auswählen
paramiko.util.log_to_file("D:\\temp\\paramiko.log", level=10)
Beim anderen Server kommt das raus:INF [20050114-22:28:16] paramiko.transport: Connected (version 2.0, client OpenSSH_3.9p1)
DEB [20050114-22:28:16] paramiko.transport: Write packet <kexinit>, length 318
DEB [20050114-22:28:17] paramiko.transport: Read packet <kexinit>, length 625
DEB [20050114-22:28:17] paramiko.transport: Ciphers agreed: local=aes128-cbc, remote=aes128-cbc
DEB [20050114-22:28:17] paramiko.transport: kex algos:['diffie-hellman-group-exchange-sha1', 'diffie-hellman-group14-sha1', 'diffie-hellman-group1-sha1'] server key:['ssh-rsa', 'ssh-dss'] client encrypt:['aes128-cbc', '3des-cbc', 'blowfish-cbc', 'cast128-cbc', 'arcfour', 'aes192-cbc', 'aes256-cbc', 'rijndael-cbc@lysator.liu.se', 'aes128-ctr', 'aes192-ctr', 'aes256-ctr'] server encrypt:['aes128-cbc', '3des-cbc', 'blowfish-cbc', 'cast128-cbc', 'arcfour', 'aes192-cbc', 'aes256-cbc', 'rijndael-cbc@lysator.liu.se', 'aes128-ctr', 'aes192-ctr', 'aes256-ctr'] client mac:['hmac-md5', 'hmac-sha1', 'hmac-ripemd160', 'hmac-ripemd160@openssh.com', 'hmac-sha1-96', 'hmac-md5-96'] server mac:['hmac-md5', 'hmac-sha1', 'hmac-ripemd160', 'hmac-ripemd160@openssh.com', 'hmac-sha1-96', 'hmac-md5-96'] client compress:['none', 'zlib'] server compress:['none', 'zlib'] client lang:[''] server lang:[''] kex follows?False
DEB [20050114-22:28:17] paramiko.transport: using kex diffie-hellman-group1-sha1; server key type ssh-rsa; cipher: local aes128-cbc, remote aes128-cbc; mac: local hmac-sha1, remote hmac-sha1
DEB [20050114-22:28:17] paramiko.transport: Write packet <kex30>, length 134
DEB [20050114-22:28:17] paramiko.transport: Read packet <kex31>, length 434
DEB [20050114-22:28:17] paramiko.transport: Write packet <newkeys>, length 1
DEB [20050114-22:28:17] paramiko.transport: Read packet <newkeys>, length 2
DEB [20050114-22:28:17] paramiko.transport: Switch to new keys ...
DEB [20050114-22:28:17] paramiko.transport: Attempting password auth...
DEB [20050114-22:28:17] paramiko.transport: Write packet <service-request>, length 17
DEB [20050114-22:28:17] paramiko.transport: Read packet <service-accept>, length 18
DEB [20050114-22:28:17] paramiko.transport: userauth is OK
DEB [20050114-22:28:17] paramiko.transport: Write packet <userauth-request>, length 51
DEB [20050114-22:28:17] paramiko.transport: Read packet <userauth-failure>, length 46
INF [20050114-22:28:17] paramiko.transport: Authentication failed.
DEB [20050114-22:28:17] paramiko.transport: EOF in transport thread
DEB [20050114-22:32:20] paramiko.transport: Banner: 220 serverXXX.webpack.hosteurope.de FTP server ready
DEB [20050114-22:32:20] paramiko.transport: Banner: 500 SSH-2.0-PARAMIKO_1.1 not understood
DEB [20050114-22:34:43] paramiko.transport: Banner: 421 Login Timeout (150 seconds): closing control connection.
DEB [20050114-22:34:43] paramiko.transport: EOF in transport thread
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Lieber Jens, du verwechselst SFTP mit FTPS. SFTP ist ein Datei-hin-und-her-schubs-Subsystem von SSH2, das heißt, es wird durch SSH Verschlüsselt und hat mit FTP nichts zu tun. FTPS ist wie HTTPS ein verpacktes FTP (wie auch HTTP), das ganz normal funktioniert, bis auf das es in einem SSL (nicht SSH) Tunnel geschürtzt ist. Also kann man mit paramiko nicht auf FTPS zugreifen, da es ja kein SSL unterstützt. Dazu bräuchtest du stunnel oder PyOpenSSL.jens hat geschrieben:Also ich hab zwei Server mit den ich es testen kann... Und ich kann eine Verbindung mir FileZilla und dem User/Passwort aufbauen...
Der eine Server ist vom Typ "SFTP über SSH2", bei dem bekomme ich SSHException: Authentication failed
Der andere Server ist vom Typ "FTP über SSL (Explizite Verschlüsselung)"
Welche Server Einstellungen hast du denn?
Ich habe zwei SSH2 Server, einmal meinen beschriebenen Router und einmal einen Server im Internet mit OpenSSH 3.6.1p2, zu dem ich mit dem beschriebenen Script verbinden kann. Zum benutzen von SFTP Verbindungen solltest du mal WinSCP im SFTP-only Modus nutzen und uns sagen, was es sagt.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Aha! Ich wunderte mich eh schon immer was die verschiedenen Servertypen in Filezilla zu bedeuten haben. Danke für deine Ausführungen...
Ich hab mal WinSCP benutzt:
Ich hab mal WinSCP benutzt:
. Server version: SSH-2.0-OpenSSH_3.9p1
. We claim version: SSH-2.0-WinSCP-release-3.7.1
. Using SSH protocol version 2
. Doing Diffie-Hellman group exchange
. Doing Diffie-Hellman key exchange
. Host key fingerprint is:
. ssh-rsa 1024 78:bc:89:7a:40:3a:e1:3e:87:6a:1b:4d:66:1e:ba:a9
. Initialised AES-256 client->server encryption
. Initialised AES-256 server->client encryption
. Initialised HMAC-SHA1 client->server MAC algorithm
. Initialised HMAC-SHA1 server->client MAC algorithm
! Using username "XXX".
. Keyboard-interactive authentication refused
. Session password prompt (XXX's password: )
. Using stored password.
. Sent password
! Access denied
. Access denied
. Keyboard-interactive authentication refused
. Session password prompt (XXX's password: )
. Asking user for password.
. Unable to authenticate
. Attempt to close connection due to fatal exception:
* Unable to authenticate
. Closing connection.
* (ESshFatal) Authentication failed.
Zuletzt geändert von jens am Samstag 15. Januar 2005, 13:13, insgesamt 2-mal geändert.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Dann ist es kein Python Problem, sondern das Problem, dass du einfach keinen Zugriff auf den Server hast.
Meine Theorie: Normalerweise verbindest du dich mit dem Server per FTPS, was auch klappt, da der FTPd des Servers dich als User mit Passwort kennt. Jetzt hast du aber versucht, dich per SFTP zu verbinden und zufälligerweise ist auf dem Server auch ein SSHd, der die Verbindung auch startet. Da du aber dem SSHd den Usernamen und das Passwort des FTPS Accounts gibst und es aber keinen solchen User mit einem solchen Passwort im System (/etc/passwd, oder auch im SFTP Subsystem) gibt SSHd sagt, dass du nicht authorisiert bist.
Also das wäre eine Erklärung, denn so wie ich das sehe ist bei dir technisch alles eigentlich okay.
Meine Theorie: Normalerweise verbindest du dich mit dem Server per FTPS, was auch klappt, da der FTPd des Servers dich als User mit Passwort kennt. Jetzt hast du aber versucht, dich per SFTP zu verbinden und zufälligerweise ist auf dem Server auch ein SSHd, der die Verbindung auch startet. Da du aber dem SSHd den Usernamen und das Passwort des FTPS Accounts gibst und es aber keinen solchen User mit einem solchen Passwort im System (/etc/passwd, oder auch im SFTP Subsystem) gibt SSHd sagt, dass du nicht authorisiert bist.
Also das wäre eine Erklärung, denn so wie ich das sehe ist bei dir technisch alles eigentlich okay.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Hab hier mal mich mit FileZilla mit Debugmeldungen verbunden (Die Socket Meldungen hab ich rausgeschnitten):
Und wie geschrieben, ich hab in FileZilla "SFTP über SSH2" als Servertyp ausgewählt...
Demnach ist es doch eigentlich das selbe was WinSCP macht, oder?Status: Verbinden mit XXX:22...
Trace: FzSFtp.exe: FzSFtp started and initialized.
Status: Verbunden mit XXX:22, SFTP-Verbindung wird initialisiert...
Befehl: CONNECT XXX:22
Trace: FzSFtp.exe: Ssh.c(2117): Server version: SSH-2.0-OpenSSH_3.9p1
Trace: FzSFtp.exe: Ssh.c(2153): We claim version: SSH-2.0-PuTTY-FZ-Local: Oct 27 2004 19:41:19
Trace: FzSFtp.exe: Ssh.c(2155): Using SSH protocol version 2
Trace: FzSFtp.exe: Ssh.c(4520): Doing Diffie-Hellman group exchange
Trace: FzSFtp.exe: Ssh.c(4548): Doing Diffie-Hellman key exchange
Trace: FzSFtp.exe: Ssh.c(4605): Host key fingerprint is:
Trace: FzSFtp.exe: Ssh.c(4606): ssh-rsa 1024 78:bc:89:7a:40:3a:e1:3e:87:6a:1b:4d:66:1e:ba:a9
Trace: FzSFtp.exe: Ssh.c(691): Initialised AES-256 client->server encryption
Trace: FzSFtp.exe: Ssh.c(691): Initialised AES-256 server->client encryption
Trace: FzSFtp.exe: Ssh.c(691): Initialised HMAC-SHA1 client->server MAC algorithm
Trace: FzSFtp.exe: Ssh.c(691): Initialised HMAC-SHA1 server->client MAC algorithm
Trace: FzSFtp.exe: Ssh.c(5356): Keyboard-interactive authentication refused
Trace: FzSFtp.exe: Ssh.c(5615): Sent password
Trace: FzSFtp.exe: Ssh.c(5001): Access granted
Trace: FzSFtp.exe: Ssh.c(5699): Opened channel for session
Trace: FzSFtp.exe: Ssh.c(6147): Started a shell/command
Und wie geschrieben, ich hab in FileZilla "SFTP über SSH2" als Servertyp ausgewählt...