Zugriff auf externen Server mit SSH - private key - scp funktioniert, rsync nicht

Status
Für weitere Antworten geschlossen.

Alfredo123

Benutzer
Mitglied seit
21. Jun 2020
Beiträge
35
Punkte für Reaktionen
0
Punkte
6
Hi, ich danke auch euch!
"Optimierung der Laufzeit": Darauf kann ich, denke ich, verzichten - wie schon gesagt, es geht um Dateien mit einer max. Grösse von um 3kB, da benötigt eine zusätzliche Abfrage evtl. mehr Zeit als das Prüfen der Checksumme.

@luddi; Leider versteh ich jetzt erstmal gar nix davon, was du da vorschlägst. Ich nehme mal an, das $1 und $2 am Anfang sind Parameter für die 2 Download-Verzeichnisse?

Auch wenn ich dir glaube, dass das funktioniert: ich hab halt auch immer gern den Anspruch, dass ich auch verstehe, was ich mache. Lässt es sich mit einfachen Worten erkären, was deine 2 Zeilen (string1, string2) machen? Würde mir wahrscheinlich viel Sucharbeit ersparen, und auch wenn ich dann mit Sicherheit immer noch suchen muss, das Verstehen erleichtern.

Aus beiden Antworten schliesse ich aber, dass auch ihr der Meinung seid, dass so eine "sichere Übertragung" gewährleistet werden kann???
 

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.242
Punkte für Reaktionen
586
Punkte
174
Lässt es sich mit einfachen Worten erkären, was deine 2 Zeilen (string1, string2) machen?

Das kann ich gerne machen.

  • Mit source1 und source2 werden die beiden Downloadverezichnisse festgelegt die du für den Vergleich heranziehen möchtest.
  • Diese Variablen werden durch die Argumente beim Skriptaufruf übergeben --> script.bash arg1 arg2
  • wobei arg1 der Pfad zum Verzeichnis 1 und arg2 der Pfad zum Verzeichnis 2 sein soll
  • wenn du es nicht über Argumente übergeben möchtest kannst du die Pfade auch direkt im Skript unterbringen
  • z.b. source1=Pfad/dir1 und source2=Pfad/dir2 --> und rufst das Skript ohne Argumente auf.
  • find $source1 -type f -exec openssl dgst -md5 {} \; sucht nun in dem Verzeichnis 1 nach allen vorhandenen Dateien und berechnet die MD5 Prüfsumme.
  • Zusätzlich kommt ein weiterer Befehl egrep -o [0-9a-zA-Z]{32} per Pipe Operator hinzu welcher nach dem String der Prüfsumme sucht. Da die MD5 aus 32 Zeichen besteht, sucht man nach Vorkommen von Ziffern (0-9) und Buchstaben von a-z (sowohl klein als auch groß).
  • Somit wird für jede Datei nur die jeweils berechnete Prüfsumme an die Variable string1 (respektive string2) mit angehängt
  • Wenn man sich z.B. die Variable string1 mit einem echo $string1 ausgeben würde, bekäme man eine Folge von Prüfsummen durch ein Leerzeichen getrennt. --> etwa so: 9b25d4c04ddb4de5a9ec15bdd5a12692 5e8945f01649d664cf5eb06864cd3c96 3d6a7e09394b76767c4042717e923031... usw.
  • Das gleiche wird natürlich auch für das Verzeichnis 2 getan, Prüfsumme MD5 berechnen und in der Variable string2 ablegen
  • Zuletzt werden beide Strings miteinander verglichen und entsprechend wenn beide Strings identisch sind ein OK ausgegeben und anderenfalls ein ERROR.
Bei der Fallunterscheidung kann man nun entweder eine Warnung ausgeben wenn der Prüfsummenvergleich nicht erfolgreich war, oder wenn alles erfolgreich verglichen wurde die Dateien entsprechend am Quellverzeichnis (dem Server) die Dateien löschen.

Aus beiden Antworten schliesse ich aber, dass auch ihr der Meinung seid, dass so eine "sichere Übertragung" gewährleistet werden kann???
Über eine Prüfsumme beide Downloads zu vergleichen ist eine der sichersten Methoden würde ich in meinem jugendlichen Leichtsinn behaupten...
Wenn die Implementierung der Berechung und Überprüfung im Skript Ordnungsgemäss erfolgt ist, so sollte keine Gefahr bestehen.
 
  • Like
Reaktionen: Alfredo123

tproko

Benutzer
Sehr erfahren
Mitglied seit
11. Jun 2017
Beiträge
2.101
Punkte für Reaktionen
253
Punkte
129
Aus beiden Antworten schliesse ich aber, dass auch ihr der Meinung seid, dass so eine "sichere Übertragung" gewährleistet werden kann?

Ja der Meinung bin ich auch. Wenn per Mitm Angriff wer was rein schaufelt oder zB. die Firmenfirewall SSL aufbricht und Daten ändert, dann lässt sich das definitiv gut mit den md5 Hash querchecken.
Daher ja mein Vorschlag dazu, gleiche Dateigröße heißt potentiell noch nicht viel.
 
  • Like
Reaktionen: Alfredo123

Alfredo123

Benutzer
Mitglied seit
21. Jun 2020
Beiträge
35
Punkte für Reaktionen
0
Punkte
6
Und wieder mal danke an alle, besonders an @luddi für die ausführliche Beschreibung. Nachdem ich jetzt danke deiner Erklärungen weiss was deine Zeilen string1=` bezwecken, weiss ich, wonach ich suchen muss, um es komplett zu verstehen... (y)

Und ja, was ich bei einer Fallunterscheidung machen muss, war eh klar. Fehlermeldung macht keinen Sinn, der Endanwender soll von der ganzen Geschichte gar nichts mitbekommen. Das heisst, im Fehlerfall einfach aufräumen (Download-Verzeichnisse leeren usw) und davon ausgehen, dass es beim nächsten Mal gut geht. Wird sowieso alle halbe Stunde gemacht.

Und in 99,9% wird sowieso alles funktionieren. Der ganze Aufwand dient tatsächlich nur dazu, auch diese 0,1% mitzukriegen. Denn 0,1% im Nirwana verschwundenen Produktionsaufträge sind halt 0,1% zuviel.

Wie gesagt, Laufzeitoptimierung ist eigentlich kein Thema. Was mir an der Lösung jetzt aber gefällt, ist, dass für den md5-check nicht auch noch Zwischendateien benötigt werden. Das ist über Variablen natürlich entschieden eleganter. :):)


,
 

DrDeath

Benutzer
Mitglied seit
31. Aug 2018
Beiträge
189
Punkte für Reaktionen
71
Punkte
34
Du könntest ja, wenn du fertig bist, das komplette Script (anonymisiert) zur Verfügung stellen.
 

Alfredo123

Benutzer
Mitglied seit
21. Jun 2020
Beiträge
35
Punkte für Reaktionen
0
Punkte
6
Klar, werd ich machen - ohne eure Hilfe wär ich nie und nimmer so weit gekommen, wie ich jetzt schon bin. Der grösste Teil wird eh das sein, was du vorgeschlagen hast, lediglich erweitert um den doppelten Download und den md5-check. Wird aber sicher noch ein paar Tage dauern, hab dummerweise auch noch anderes (eiligeres) zu tun.....;);)
 

Alfredo123

Benutzer
Mitglied seit
21. Jun 2020
Beiträge
35
Punkte für Reaktionen
0
Punkte
6
Hi zusammen,
jetzt ging es doch schneller als gedacht, im Anhang mein fertiges Script.
Für alle, die den Thread nicht von Anfang gelesen haben: Fast alles in diesem Script ist nicht auf meinem Mist gewachsen, sondern kommt vor allem von @DrDeath und @luddi und den Tips von ein paar anderen hilfsbereiten Usern. Im Prinzip ist das Einzige, was von mir kommt, die Idee, das Ganze mit doppeltem Download und Vergleich der 2 Downloads sicherer zu machen.;)

Ein paar Erklärungen dazu:
Ich hab schon einiges getestet, dabei sah es immer gut aus. Heisst aber natürlich nicht, das es wirklich fehlerfrei ist.
Ich hab auch versucht, wo es ging Variablen (nach @luddi ) für die benutzten Verzeichnisse zu nutzen, weil das das Ganze naürlich lesbarer und auserdem leichter zu ändern macht. Ganz am Anfang beim SFTP-Download bin ich damit aber gescheitert - obs tatsächlich nicht geht oder ich nur zu blöd war, weiss ich nicht.

Und ja, ich persönlich benötige 2 Zielverzeichnisse für die Daten. Wird für die meisten von euch nicht notwendig sein.

Dass ich die SFTP-Verbindung vor dem 2. Download beende und neu aufbaue, hat auch seinen Grund: Ich denke, wenn womöglich ein Serverfehler vorliegt, könnte der Download auch 2mal mit dem gleichen Fehler erfolgen, der dann nicht erkannt würde. Die Chance sollte beim Neuaufbau kleiner werden. Ob diese Annahme richtig ist, weiss ich nicht, aber schaden wirds sicher auch nicht.:)

Und dass ich selbst den lokalen Endtransfer noch überprüfe: Ja, es ist sehr wichtig, dass die Dateien fehlerfrei abgelegt werden. Und da nutze ich lieber zu den 3 Gürteln auch noch 2 Hosenträger; wird für die meisten von euch übertrieben sein, aber ich fühl mich so wohler.:eek:
Im Fehlerfall (egal welcher Fehler) lösche ich einfach alles und probiers mit dem nächsten Aufruf wieder von vorn; wird alle 30 Minuten abgearbeitet, und sind nur sehr kleine Dateien.

Hinweise auf Denkfehler und sonstige Verbesserungsvorschläge sind selbstverständlich willkommen!!!!

Ach ja, und nochmal danke für alle Tips! Hab die letzten Tage dank euch viel gelernt!
 

Anhänge

  • SftpSecuredDownload_2020-06-24.zip
    1,2 KB · Aufrufe: 6
Zuletzt bearbeitet:

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.242
Punkte für Reaktionen
586
Punkte
174
@Alfredo123 Sieht doch ganz gut aus. Ich hätte drei Anmerkungen dazu.

  1. exit 1 jeweils in Zeile 34 und 66 --> vergib unterschiedliche Exit Codes falls du später eine Fehlerbehandlung durchführen möchtest damit du weißt woher der Fehler kommt. Fehler ist Fehler, außer man möchte wissen welcher passiert ist.
  2. Wenn es nur exit codes im Fehlerfall gibt, würde auch ein explizites exit für den erfoglreichen Ablauf des Scripts nicht schaden ---> Zeile 107 exit 0
  3. Zeile 88 --> Variable Res kann einfach mit 1 beschrieben werden wie auch in Zeile 78 (Addition mit +1 kann man sich sparen). Außer du möchtest später den Result auswerten ob dort eine "1" oder eine "2" drin steht. Dies passiert aber in dem Skript nicht weil die Variable Res nur an einer Stelle auf Ungleich "0" geprüft wird. Funktionalität dennoch gegeben und deshalb auch kein Fehler.
Sehr gute Arbeit und es scheint dir zusätzliche Sicherheit mit der redundanten Prüfung des lokalen Kopiervorgangs zu geben.

VG, luddi
 
  • Like
Reaktionen: Alfredo123

Alfredo123

Benutzer
Mitglied seit
21. Jun 2020
Beiträge
35
Punkte für Reaktionen
0
Punkte
6
Hi nochmal, danke dir für die Anmerkungen.
1.: Das war mir durchaus klar; es gibt für mich aber keinen Grund, die exit codes auszuwerten. Deshalb wars mir wurscht. Hast aber definitiv Recht, zu vernünftigem "Programmieren" gehört das eigentlich dazu.
2. Da bin ich (wohl falsch) davon ausgegangen, dass er exit-code automatisch 0 wird, wenn nichts programmiert wird.
3. Auch da hast du Recht; da wollte ich besonders schlau sein und quasi ein "Oder" der beiden Prüfungen realisieren - mach ich bei Windows-Programmen oft so in der Art. Macht aber hier absolut keinen Sinn :eek:
 

DrDeath

Benutzer
Mitglied seit
31. Aug 2018
Beiträge
189
Punkte für Reaktionen
71
Punkte
34
Vielen Dank für das Bereitstellen des "Endergebnisses", es freut mich das Du es umgesetzt hast.
 
  • Like
Reaktionen: Alfredo123

Alfredo123

Benutzer
Mitglied seit
21. Jun 2020
Beiträge
35
Punkte für Reaktionen
0
Punkte
6
Musste meine "2 Hosenträger" (die beiden md5-Vergleiche downloadDir1-destDir1-destDir2) am Ende wieder entfernen; was ich nicht beachtet hatte: Die beiden "endgültigen User-Verzeichnisse werden ja vom User asynchron bearbeitet und diese Dateien dann dementsprechend auch asynchron verschoben/gelöscht. Vergleiche sowohl mit dem Download-Verzeichnis als auch die 2 User-Verzeichnisse untereinander machen also keinen Sinn.
Muss mich an dieser Stelle halt auf rsync verlassen.
 

DrDeath

Benutzer
Mitglied seit
31. Aug 2018
Beiträge
189
Punkte für Reaktionen
71
Punkte
34
also nach dem:
Code:
# move contents of locally downloaded folder to destination folder to be ready for next download
rsync -av $downloadDir1/* $destDir1
rsync -av $downloadDir1/* $destDir2


folgt dann nur noch:
Code:
#in each case, cleanup download directories
rm $downloadDir1/*
rm $downloadDir2/*

oder wurde noch etwas anderes angepasst ? (Ich bin nur neugierig :) )
 

Alfredo123

Benutzer
Mitglied seit
21. Jun 2020
Beiträge
35
Punkte für Reaktionen
0
Punkte
6
Ja, genau so! Bin grad dabei, als "Ersatz" noch das Erstellen einer täglichen Log-Datei dazuzubasteln. Wenn auch das fertig ist, werd ich das Gesamt-Script noch einmal posten...
Und während ich dir das grade schreibe, fällt mir ein, dass ich (statt der beiden gelöschten Vergleiche) wenigstens noch die Exit-Codes der beiden rsync auswerten könnte - nur bei beiden exit-codes 0 alles ok, ansonsten alles löschen wie vorher auch. Und so werd ichs auch machen.
 

Alfredo123

Benutzer
Mitglied seit
21. Jun 2020
Beiträge
35
Punkte für Reaktionen
0
Punkte
6
So, nun ist sie da, die (vorläufig ;) ) endgültige Version. Änderungen wie oben beschrieben, dann noch die Anmerkungen von @luddi eingebaut. Hauptsächlich aber eben auch das Logfile - war mir wichtig, um bei fehlenden Daten auch später noch nachvollziehen zu können, obs am Script oder am Endanwender gelegen hat... :D
Hoffe, ihr findet keine Fehler - wenn doch, immer her damit!

Und noch eine Nachfrage, die aber fast "OffTopic" ist: Ich hab nun einige Scripts, die im Aufgabenplaner mit einer Frequenz unter 1 Stunde laufen. Ich schaffe es nicht, dort in der Startzeit die Minuten einzustellen (nur bei Frequenz ab 1 Stunde). Das stört mich etwas, da dann diverse Scripts immer gleichzeitig ausgeführt werden (zur vollen und halben Stunde). Gibts da einen Trick, oder ist das so gewollt und macht womöglich sogar Sinn?
Nochmal Danke und Grüsse...
 

Anhänge

  • SftpSecuredDownload_2020-06-25.zip
    1,3 KB · Aufrufe: 2

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.242
Punkte für Reaktionen
586
Punkte
174
Bezüglich des Aufgabenplaners ist es über die WebUI (DSM) nicht möglich die definierten Aufgaben Minutengenau zu steuern.

Man kann aber die crontab manuall über die Konsole bearbeiten.

Man öffnet die Datei /etc/crontab mit einem Editor (vi, nano, ... --> z.B. nano /etc/crontab) und sieht hierin all die Aufgaben die bereits existieren. Hierin findet man aber nur die Information auf eine synoschedtask mit einem run Befehl und einer entsprechenden ID.

Sieht dann wie folgt aus:
Code:
#minute hour mday month wday who command
0       7       *       *       3       root    /usr/syno/bin/synoschedtask --run id=20
0       7       *       *       4       root    /usr/syno/bin/synoschedtask --run id=25
30      14      *       *       *       root    /usr/syno/bin/synoschedtask --run id=31

Möchte man nun die Zugehörigkeit der ID zu Task wissen kann man folgenden Befehl aufrufen: synoschedtask --get
Hier werden nun alle definierten Aufgaben mit ihrer jewiligen ID gelistet und weiß somit welcher Eintrag im Cron zu editieren ist.

Wenn man dies herausgefunden hat ändert man die ensprechende Zeile in der /etc/crontab und speichert die Änderungen.
Anschließend den Dienst Crond neu starten mit dem Befehl synoservice --restart crond
 
  • Love
Reaktionen: Alfredo123

Alfredo123

Benutzer
Mitglied seit
21. Jun 2020
Beiträge
35
Punkte für Reaktionen
0
Punkte
6
Hi nochmal,
und schon wieder brauch ich Hilfe beim md5-Vergleich.
Da ich auch Dateien hochladen muss, wollte ich dasselbe System zur Überprüfung nutzen. Das heisst: Ich lade die Dateien hoch mit mput *, lade sie sofort wieder herunter mit mget *, und vergleiche die MD5 der Dateien vom ursprünglichen Sendeverzeichnis mit denen im Download-Verzeichnis. Vorgehen genau wie im Download-Script nach dem Vorschlag von @luddi
Das Problem: Die beiden Strings sind nicht gleich, da offensichtlich die Dateien nicht in der gleichen Reihenfolge bearbeitet werden. Beispiel bei 2 Dateien:
Code:
string1=`find $sendDir -type f -exec openssl dgst -md5 {} \; | egrep -o [0-9a-zA-Z]{32}`
string2=`find $tempDownloadDir -type f -exec openssl dgst -md5 {} \; | egrep -o [0-9a-zA-Z]{32}`
Ergebnis:
String1: 2b2b56dae9a16df0fa811f8051685c88 d7cb889adc1cac7375d3f310d0ba6a77
String2: d7cb889adc1cac7375d3f310d0ba6a77 2b2b56dae9a16df0fa811f8051685c88
Hat einer eine Idee, wie ich aus dem Dilemma komme, ohne die Dateien einzeln vergleichen zu müssen?
Danke!

Edit: Hab mittlerweile was gefunden, was prinzipiell funktioniert:
echo $string1 | tr " " "\n" | sort | tr "\n" " "
aber wie bekomme ich diese Shell-Ausgabe dann in eine neue Stringvariable zum Vergleich?
stringS1=$string1 | tr " " "\n" | sort | tr "\n" " " funzt nicht. Sorry, immer noch Linux-Anfänger :cry:

Ausserdem gibts ja evtl. (wahrscheinlich) wieder eine viel elegantere Lösung.. ;)
 
Zuletzt bearbeitet:

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.242
Punkte für Reaktionen
586
Punkte
174
Um die Ausgabe eines Befehls oder Befehlskette einer Variablen zuzuweisen muss die komplette Anweisung entweder in Backticks oder $-Klammer Konstrukt gesetzt werden.
  1. var=`befehl1 | befehl2`
  2. var=$(befehl1 | befehl2)
Außerdem ist es möglich den Sort Befehl gleich bei der ersten Anweisung mit find und Berechnung der md5 und den grep gleich hinten dranzuhängen.
 
  • Like
Reaktionen: Alfredo123

Alfredo123

Benutzer
Mitglied seit
21. Jun 2020
Beiträge
35
Punkte für Reaktionen
0
Punkte
6
Prima, danke, das funzt. Wieder was gelernt.
Das mit dem sort hinten anhängen ging aber (bei mir) nicht; wie müsste das richtig aussehen?
Ist nicht wichtig, mit dem stringS1=$() funktionierts ja und reicht mir auch, die Zusatzfrage ist mehr Nuegierde oder positiv ausgedrückt Lern-Interesse..
 
Zuletzt bearbeitet:

Benares

Benutzer
Sehr erfahren
Mitglied seit
27. Sep 2008
Beiträge
12.250
Punkte für Reaktionen
2.846
Punkte
423
Probier mal die 2. Variante von luddi mit
Code:
stringS1=$(echo $string1 | tr " " "\n" | sort | tr "\n" " ")
So aus dem Kopf - ohne wirklich gelesen und verstanden zu haben, worum es geht ;)
 
  • Like
Reaktionen: Alfredo123

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.242
Punkte für Reaktionen
586
Punkte
174
  • Like
Reaktionen: Alfredo123
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat