halloICKEbins
Anmeldungsdatum: 12. September 2017
Beiträge: 226
|
Mahlzeit, habe ein Problem mit den nachfolgenden Script und dem Zusatz mittels SCPClient: seahawk1986 schrieb: halloICKEbins schrieb: Danke schonmal dafür ...habe noch eine kleine Fehlermeldung: paramiko.ssh_exception.AuthenticationException: Authentication failed. Liegt vermutlich daran, dass ich mit einem Key eines anderen Benutzers komme oder !?
Ohne Kontext kann ich das nicht sagen. Der Traceback ist doch vermutlich einige Zeilen länger. Ich habe gerade noch gesehen, dass ich im Gegensatz zu deinem Beispielcode den Benutzernamen bei einer Authentifikation mit RSA-Keys nicht übergebe - das lässt sich mit Zeile 24 ff. beheben:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 | # init_ssh.py
import os
import sys
import paramiko
from functools import partial
FILE_KEY = '/.../.../my.key' # replace with a valid path
KEY_FILE_RSA = '/../../id_rsa' # replace with a valid path
def read_authentication():
with open(FILE_KEY, 'r') as f:
username, password, *_ = f.read().splitlines()
return username, password
def prepare_ssh_client():
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.load_system_host_keys()
try:
client.load_system_host_keys(os.path.expanduser(KEY_FILE_RSA))
except IOError as e:
print("Could not read KEY_FILE_RSA:", e, file=sys.stderr)
username, password = read_authentication()
client._connect = client.connect
client.connect = partial(client._connect, username=username)
client.connect_with_username_and_password = partial(
client._connect, username=username, password=password, allow_agent=False, look_for_keys=False)
return client
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | from scp import SCPClient
client = prepare_ssh_client()
try:
client.connect_with_id('1.1.1.1')
with SCPClient(client.get_transport()) as scp:
scp.get('/home/user/file*', '/home/server/')
scp.close()
client.close()
print('keine Fehler')
except:
print ('Fehler')
continue
....
|
Mein Problem ist, dass er mir immer "Fehler" schreibt, aber alles anscheinend sauber durchläuft - er kopiert die 5 Dateie welche in dem Verzeichnis liegen (auch bei Exeption as e kommt nicht Speziefisches)!
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11176
Wohnort: München
|
Das scp.close() in Zeile 8 des von dir geposteten Scripts ist IMHO überflüssig, wenn du den SCPClient mit einem with-Statement nutzt und client.close() solltest du in einem finally -Block aufrufen, damit das auf jeden Fall ausgeführt wird. halloICKEbins schrieb: auch bei Exeption as e kommt nicht Speziefisches
Du musst dir die Exception (und den Typ) ansehen, damit du eine Idee bekommst, wo der Fehler herkommt - also z.B.:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 | from scp import SCPClient, SCPException
from init_ssh import prepare_ssh_client
import sys
client = prepare_ssh_client()
try:
client.connect_with_id('1.1.1.1')
except Exception as e:
sys.exit('Fehler bei der SSH-Verbindung: {}'.format(e))
try:
with SCPClient(client.get_transport()) as scp:
scp.get('/home/user/file*', '/home/server/')
except SCPException as e:
print('Fehler bei der Datenübertragung mit SCP:', e, file=sys.stderr)
except OSError as e:
print('Fehler beim speichern der Datei(en):', e, file=sys.stderr)
except Exception as e:
print('unterwarteter Fehler:', e, file=sys.stderr)
else:
print('keine Fehler', file=sys.stderr)
finally:
client.close()
|
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11176
Wohnort: München
|
Und wenn du an genauere Informationen kommen willst, kannst du traceback nutzen.
|
snafu1
Anmeldungsdatum: 5. September 2007
Beiträge: 2123
Wohnort: Gelsenkirchen
|
Oder einfach den Fehler zunächst nicht abfangen, um ihn mal zu Gesicht zu bekommen. Ist übrigens genau der Grund, warum man Exception-Behandlung in den meisten Fällen besser nicht so macht wie hier zu sehen.
|
halloICKEbins
(Themenstarter)
Anmeldungsdatum: 12. September 2017
Beiträge: 226
|
Danke schonmal dafür! Fehlermeldung lautet: Fehler bei der Datenübertragung mit SCP: scp: /home/user1/file*: No such file or directory Es liegt also an der Wildcard - wenn ich sie mit Namen kopiere gehts ... gibt eine andere Möglichkeit als mit dem Sternchen zu arbeiten?
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11176
Wohnort: München
|
Funktioniert es denn mit dem Sternchen im Pfad, wenn du scp nutzt? Was für eine Shell läuft auf dem System, zu dem du dich verbindest?
|
halloICKEbins
(Themenstarter)
Anmeldungsdatum: 12. September 2017
Beiträge: 226
|
Nein funktioniert nicht...auf dem anderen System ist die Shell: /bin/bash - Ubuntu Server 18.04.01 Des Weiteren habe ich immer die Meldung: /usr/lib/python3/dist-packages/Crypto/Cipher/blockalgo.py:141: FutureWarning: CTR mode needs counter parameter, not IV
self._cipher = factory.new(key, *args, **kwargs)
Wie bekomme ich diese Meldung nicht mehr angezeigt/verhindert/gefixt?
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11176
Wohnort: München
|
halloICKEbins schrieb: Nein funktioniert nicht...auf dem anderen System ist die Shell: /bin/bash - Ubuntu Server 18.04.01
Und welche Dateien gibt es in /home/user1/ und wie sehen die Berechtigungen aus? Darf der Benutzer, der über SSH darauf zugreift die den Inhalt des Verzeichnis listen? Des Weiteren habe ich immer die Meldung: /usr/lib/python3/dist-packages/Crypto/Cipher/blockalgo.py:141: FutureWarning: CTR mode needs counter parameter, not IV
self._cipher = factory.new(key, *args, **kwargs)
Wie bekomme ich diese Meldung nicht mehr angezeigt/verhindert/gefixt?
Laut https://stackoverflow.com/questions/42029415/paramiko-futurewarning-ctr-mode-needs-counter-parameter könntest du mal eine neuere Version von von Paramiko (vgl. paramiko/paramiko/issues/713) probieren.
|
halloICKEbins
(Themenstarter)
Anmeldungsdatum: 12. September 2017
Beiträge: 226
|
Es liegt am * Habe gerade testweise die Berechtigung auf 666 gesetzt und mit * geht es nicht ... spreche ich die Dateien mit Namen an gehts!
|
greenmoon
Anmeldungsdatum: 10. März 2010
Beiträge: 269
|
Vielleicht so?
| from glob import glob
glob("home/user/file*")
|
|
snafu1
Anmeldungsdatum: 5. September 2007
Beiträge: 2123
Wohnort: Gelsenkirchen
|
@halloICKEbins: Ich kann es selbst nicht ausprobieren, aber die Lösung scheint der sanitize-Parameter zu sein. Die Verwendung wird z.B. hier gezeigt: https://gist.github.com/stonefury/06ab3531a1c30c3b998a @greenmoon: Es geht ja um Fernzugriff. Da bringt glob() nichts, da es nicht für entfernte Systeme genutzt werden kann.
|
halloICKEbins
(Themenstarter)
Anmeldungsdatum: 12. September 2017
Beiträge: 226
|
scp = SCPClient(ssh.get_transport(), sanitize=lambda x: x) hatte ich vorher ... leider gleicher Effekt
|
snafu1
Anmeldungsdatum: 5. September 2007
Beiträge: 2123
Wohnort: Gelsenkirchen
|
halloICKEbins schrieb: scp = SCPClient(ssh.get_transport(), sanitize=lambda x: x) hatte ich vorher ... leider gleicher Effekt
Naja, im ursprünglichen Code hattest du ja alle Exceptions "verschluckt", sodass der Fehler im Detail nicht sichtbar war. Das kann also auch ein anderer Grund gewesen sein für den Fehler. Diverse Google-Ergebnisse sagen halt, dass es so funktioniert. Nach Blick in den Quellcode auf GitHub sehe ich aber auch nicht, wie das gehen soll. Vielleicht wird der Tipp ja einfach nur ungeprüft weiter gegeben. Wie dem auch sei: Du wirst das Globbing dann wohl selbst schreiben müssen. Heißt also, du holst dir die Verzeichnisliste und prüfst, welche Einträge infrage kommen. Aus file* wird dann halt:
| [fn for fn in filenames if fn.startswith('file')]
|
Falls die Wildcard-Ersetzungen komplexer sein sollen, dann kannst du dir mal fnmatch.translate() anschauen. Das liefert zu einem Wildcard-Pattern den passenden regulären Ausdruck, nach dem du dann filtern kannst. Sähe dann so aus:
| import fnmatch
import re
def match(filenames, pattern):
pattern = re.compile(fnmatch.translate(pattern), re.IGNORECASE)
return [fn for fn in filenames if pattern.match(fn)]
|
|
greenmoon
Anmeldungsdatum: 10. März 2010
Beiträge: 269
|
snafu1 schrieb: @greenmoon: Es geht ja um Fernzugriff. Da bringt glob() nichts, da es nicht für entfernte Systeme genutzt werden kann.
Das glob wäre doch auf dem lokalen Rechner und dann wird die Liste auf den Remote kopiert. Oder sehe ich das falsch? Kann das leider gerade nicht testen.
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11176
Wohnort: München
|
greenmoon schrieb: Das glob wäre doch auf dem lokalen Rechner und dann wird die Liste auf den Remote kopiert. Oder sehe ich das falsch? Kann das leider gerade nicht testen.
Er nutzt ja die get-Funktion, die führt den Befehl in einer Shell auf dem Server aus. Das mit Ersetzen der sanitize() -Funktion beim Initialisieren von SCPClient dürfte der richtige Ansatz sein, sonst passiert da einiges an String-Escaping, wenn bestimmte Zeichen im Pfad vorkommen, vgl. jbardin/scp.py/blob/master/scp.py ff.
|