PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Python3 sftp



Huhn Hur Tu
13.09.16, 09:19
Hi,

ich komme mit einem scp/sftp problem nicht weiter

An der Stelle mit dem ssh.connect macht das Ding genau das, einen connect und weil ich dort nur schreibrechte, also rechte zum hochschieben habe, macht es einen Auth fail, wie komme ich da weiter um den File zu schieben



## SSH Connect Variables
import os
import paramiko
WorkHome = os.environ.get("HOME")
SshUser = 'MyOtherUSer'
SshTarget = 'localhost'
SshFile = WorkHome + '/.ssh/id_rsa'
SshKeyFile = paramiko.RSAKey.from_private_key_file(SshFile)


ssh = paramiko.SSHClient()
ssh.load_system_host_keys()
ssh.set_missing_host_key_policy(paramiko.AutoAddPo licy())
ssh.connect(SshTarget, username=SshUser, pkey=SshKeyFile)
sftp = ssh.open_sftp()


sftp.put(LocalFile, TargetPath)
sftp.close()
ssh.close()


Gruss Stefan

nopes
13.09.16, 17:04
Kannst du ggf. den traceback posten?

Huhn Hur Tu
15.09.16, 11:04
Hi nopes,

hier der Output


Python 3.4.2 (default, Oct 8 2014, 10:45:20)
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> ## SSH Connect Variables
... import os
>>> import paramiko
>>> WorkHome = os.environ.get("HOME")
>>> SshUser = 'vnz'
>>> SshTarget = 'localhost'
>>> SshFile = WorkHome + '/.ssh/id_rsa'
>>> SshKeyFile = paramiko.RSAKey.from_private_key_file(SshFile)
>>>
>>>
>>> ssh = paramiko.SSHClient()
>>> ssh.load_system_host_keys()
>>> ssh.set_missing_host_key_policy(paramiko.AutoAddPo licy())
>>> sftp = ssh.open_sftp()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3/dist-packages/paramiko/client.py", line 379, in open_sftp
return self._transport.open_sftp_client()
AttributeError: 'NoneType' object has no attribute 'open_sftp_client'
>>> ssh.connect(SshTarget, username=SshUser, pkey=SshKeyFile)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3/dist-packages/paramiko/client.py", line 307, in connect
look_for_keys, gss_auth, gss_kex, gss_deleg_creds, gss_host)
File "/usr/lib/python3/dist-packages/paramiko/client.py", line 519, in _auth
raise saved_exception
File "/usr/lib/python3/dist-packages/paramiko/client.py", line 500, in _auth
allowed_types = self._transport.auth_publickey(username, key)
File "/usr/lib/python3/dist-packages/paramiko/transport.py", line 1232, in auth_publickey
return self.auth_handler.wait_for_response(my_event)
File "/usr/lib/python3/dist-packages/paramiko/auth_handler.py", line 208, in wait_for_response
raise e
paramiko.ssh_exception.AuthenticationException: Authentication failed.
>>>

florian0285
15.09.16, 14:25
Vielleicht sund auch mehr Details zu deinen Rechten und deinem key hilfreich. Darfst du dich einloggen? Mit ssh?

nopes
15.09.16, 15:18
Ich vermute das der Schlüssel nicht geladen werden kann, jedenfalls klingt diese Meldung so:
AttributeError: 'NoneType' object has no attribute 'open_sftp_client'Auch mein Tipp ist, zu nächst mit ssh bzw. sftp den Login via Console probieren. Viel Erfolg!

florian0285
15.09.16, 16:39
Mach dazu vielleicht auch mal ein print SshKeyFile und prüfe ob der Pfad keinen Fehler hat und welche Zugriffsrechte (600) darauf liegen.

fork
15.09.16, 21:32
Ich würde mal sagen, das ist sehr deutlich:


paramiko.ssh_exception.AuthenticationException: Authentication failed.

Mehr Info bekommst Du bestimmt im Auth-Log / ssh-Log vom Zielserver.

Ich habe Dein Script mal ausprobiert. Funktioniert bei mir einwandfrei.


Auch mein Tipp ist, zu nächst mit ssh bzw. sftp den Login via Console probieren.

Jupp. Und zwar genau mit den Optionen, die auch das Script aufruft. Keine Aliase, sondern die gleichen Werte. Vielleicht nochmal ein -v dazu.

Huhn Hur Tu
16.09.16, 06:47
Hm.. jetzt bin ich verwirrt, ich will etwas testen damit ich hier was zum poosten habe und nun funktioniert es ohne aenderung.

Ich denke da wurde auf der Gegenseite etwas gefixt und ich machte alles richtig.

Damit muss ich mich wohl bei euch entschuldigen

Huhn Hur Tu
25.10.16, 09:54
Neues Skkript, ungeloestes gleiches Problem.

An der Stelle


ssh.connect(SshTarget, username=SshUser, pkey=SshKeyFile)
sftp = ssh.open_sftp()


wird ein SSH Login gemacht, um anschliessend darueber die Dateiuebertragung zu machen.
Leider habe ich bei der Gegenstelle nur "sftp only", daher mein Problem.
Gibt es fuer paramiko einen Parameter um sftp only zu machen?
Sonst bleibt mir nichts anderes uebrig als das native "sftp" zu verwenden, was ich eigentlich vermeiden wollte

nopes
25.10.16, 10:33
Probier mal das hier aus: http://stackoverflow.com/questions/3635131/paramikos-sshclient-with-sftp

Alternativ noch: https://pypi.python.org/pypi/pysftp

Huhn Hur Tu
25.10.16, 11:37
Hi Nopes,

danke fuer die Links, aber die Stackoverflow Loesung hat das gleiche Verhalten wie mein Versuch, nur eine andere Syntax.
Pysftp habe ich gesehen, aber das System auf dem das laufen soll laeuft mit Debian 8 und dort ist pysftp nicht in den repos und pip darf hier nicht verwendet werden.
Ich werde wohl oder uebel den nativen sftp client verwenden

Gruss Stefan

Huhn Hur Tu
14.11.16, 09:55
So nachdem das eine weile lag habe ich mich an subprocess versucht, komme aber nicht weiter

ich versuche folgendes, da das Parameter uebergeben nicht so will wie ich. Ich scheitere den Befehl fuer subprocess.Popen in ein dict zu uebersetzen.



sftp -i $HOME/.ssh/id_rsa USER@HOST:/files/reporting.log.$(date -d "1 day ago" +%Y-%m-%d) reporting.log


vielleicht hat ja auch jemand eine Idee wie ich sinnvoll Variablen uebergeben kann


Today = (datetime.today())
YesterDay = (Today - timedelta(1))
YesterDayDate = (YesterDay.strftime("%Y-%m-%d"))

SourceRemotePath = '/files/reporting.log.'
TargetRemotePath = 'rsync://HOST/PATH'
WorkHome = (os.environ.get("HOME"))
TmpPath = (WorkHome + '/tool_tmp/report')
### Pseudo
sftp -i $HOME/.ssh/id_rsa USER@HOST:/files/reporting.log.YESTERDAYDATE reporting.log

nopes
14.11.16, 10:53
Zum Einen kannst du die natürlich in Python bestimmen - gerade diese Date-Variablen, zum Anderen kannst du die Umgebung vorgeben: https://docs.python.org/3/library/subprocess.html#popen-constructor


import subprocess


p = subprocess.Popen(['cmd','-arg1','arg2'], env={'FOO': 'BAR'})

bzw. kopieren und anpassen: https://docs.python.org/3/library/os.html#os.putenv


import os
import subprocess


e = dict(os.environ)
e['FOO'] = 'BAR'
p = subprocess.Popen(['cmd', '-arg1', 'arg2'], env=e)



Dein Problem ist aber hier beschrieben: https://docs.python.org/3/library/subprocess.html#frequently-used-arguments

...
If shell is True, the specified command will be executed through the shell. This can be useful if you are using Python primarily for the enhanced control flow it offers over most system shells and still want convenient access to other shell features such as shell pipes, filename wildcards, environment variable expansion, and expansion of ~ to a user’s home directory...

also sollte shell=True das Problem abschalten:


import subprocess


p = subprocess.Popen(['sftp', '-i', '$HOME/.ssh/id_rsa', 'USER@HOST:/files/reporting.log.$(date -d "1 day ago" +%Y-%m-%d)', 'reporting.log'], shell=True)

Huhn Hur Tu
17.11.16, 07:54
Ich habe von einem Kollegen gestern folgende Antwort bekommen



ich hab mal ein wenig mit subprocess.popen rumgespielt. bash
substitution geht da wohl nicht mit. also dein $(date ...)


Ich denke jetzt kommt die maximal haessliche Variante, der Aufruf eines seperaten Skriptes zum Zuge

Huhn Hur Tu
17.11.16, 11:47
Hm.. naechstes Problem, ich kann mit einem Bash Skript die Datei abholen



subprocess.Popen(['/opt/ui/data/user/git/project/sftp_fu.sh'], shell=True)


aber das Python3 Skript laeuft nicht weiter, es bleibt nur der stdout mit der fetching information stehen.



Connected to Machine.local.domain
Fetching /files/reporting.log.2016-11-16 to /opt/ui/data/user/tool_tmp/reporting.log


ich kann sehen, dass die ganze Datei abgeholt wird

das Bash Skript sieht folgendermassen aus


#!/bin/bash

sftp -i /opt/ui/data/USER/.ssh/id_rsa USER@HOST:/files/reporting.log.$(date -d "1 day ago" +%Y-%m-%d) Parthtotarget/reporting.log

exit

Huhn Hur Tu
17.11.16, 11:54
Grr, da er die Datei die das Bash Skript holen soll nicht findet (das verwenden kommt nach dem sftp), crasht python, fuehrt aber das bash Skript aus

nopes
17.11.16, 19:03
bzgl Backtick wird da etwas Licht ins Dunkel gebracht: http://stackoverflow.com/questions/28276162/python-how-to-use-backticks-in-subprocess
Kann es sein, dass das exit am Ende des Skripts dafür sorgt?

Huhn Hur Tu
21.11.16, 08:33
Eher nicht, da ich das Skript mit und ohne exit betrieben habe