# Ereignisauslösung nach SCP Datentransfer



## Tikonteroga (10. Mai 2012)

Hallo,

ich habe einen Fall bei dem über WLAN eine große Menge von Daten (1 GB) in Form von Dateien (ZIP, LOG, ...) über SCP an einen Server übertragen werden.

Sobald die Datenübertragung abgeschlossen ist, möchte ich gerne ein Programm/Skript zum Verarbeiten der übertragenen Daten ausführen, an das die übertragenen Dateien bzw. das Verzeichnis der Dateien als Parameter übergeben wird.

Gibt es bei einem SCP-Server die Möglichkeit bei bestimmten Ereignissen ein oder mehrere Programme auszuführen, so wie das bei den Hooks eines SVN-Servers möglich ist ?

Über Hinweise würde ich mich sehr freuen. Falls ihr detailiertere Informationen zur Ausgangssituation benötigt, lasst es mich bitte wissen.


----------



## imweasel (10. Mai 2012)

Wenn die die Daten per SCP überträgst, dann verbindest du dich nicht zu einem SCP-Server sondern zu einem SSH-Server, somit kannst du auch Befehle usw. per SSH auf dem Zielhost ausführen.


----------



## Tikonteroga (10. Mai 2012)

Hallo,

danke für die Antwort.

Hier sehe ich jetzt zwei Probleme. Den Client, der die Daten über SCP/SSH auf den Server hochläd, kann ich nicht verändern. Der Server steht jedoch unter meiner Kontrolle. Ist es aus Sicherheitsgründen nicht gefährlich, wenn ein Client ein Skript auf einem Server ausführen kann?


----------



## imweasel (10. Mai 2012)

du kannst ja folgendes auf deinem client machen

- erst per scp die dateien hochkopieren
- dann per ssh -lUSER HOST BEFEHL deine verarbeitung starten

Wenn du das ganze in ein Script packst, dann kannst du sogar errorhandling usw. einbauen.


----------



## Tikonteroga (11. Mai 2012)

Also der Client, der den Upload der Daten auf den Server initiert, sollte auf dem Server keine Skripte starten können. Das werde ich so nicht realisieren können, weil ich da glaube ich Ärger mit dem Verantwortlichen bekommen würde ... 

Der Server sollte das Skript unter seiner vollen Kontrolle startet können. Hier hatte ich gehofft, dass es hier ein Event gibts, dass ausgelöst wird, wenn Daten übertragen werden. Die Pfade der übertragenden Dateien, sind innerhalb des Events als Parameter enthalten.

Beim Subversion-Server gibt es z. B. diese Hooks. Wenn z. B. ein Checkin von neuen Dateien durchgeführt wird oder wurde, wird automatisch eine ausführbare Datei gestartet, die mit einem bestimmten Namen in einem bestimmten Verzeichnis liegen muss und der über eine standardisierte Schnittstelle Parameter übergeben werden. So einen Mechanismus suche ich.

Aber vielen Dank für deine Vorschläge.


----------



## slowfly (11. Mai 2012)

eeeeventuell hilft dir das da weiter? http://stefan.buettcher.org/cs/fschange/index.html


----------



## Tikonteroga (12. Mai 2012)

Hallo,

also diesen Lösungsweg habe ich auch schon analysiert.

Für eine sehr gute Lösung benötige ich aber genau ein Ereignis, dass dann ausgelöst wird, wenn die Datenübertragung abgeschlossen, die Verbindung getrennt und die Daten auf dem Server abgelegt wurden.

Wenn ich das Verzeichnis überwachen würde, müsste ja für jede einzelne Daten ein Event ausgelöst werden, die kopiert, verschoben oder gelöscht wird. Da müsste man dann wohl einen aufwändigen Zustandsautomat implementieren ...

Ich halte mir diese Alternative aber im Hinterkopf, falls sich zeigt, dass die andere Lösung so nicht möglich ist.


----------



## imweasel (12. Mai 2012)

Kannst du auf dem Server ein Skript (z.B. in Perl) laufen lassen? Dann kannst du das Verz. einfach permanent überwachen und wenn z.B. eine Semaphore übertragen wurde (also datei.zip + datei.zip.sem) eine Aktion auslösen.

Sowas habe ich mal in Perl erstellt... wenn Interesse besteht, einfach melden.


----------



## Tikonteroga (12. Mai 2012)

Hallo,

also die Daten, die übertragen werden, sind eigentlich bereits festgelegt bzw. ich müsste das Image bzw. die Firmware von über 100 Embedded Systemen Akt


----------



## imweasel (12. Mai 2012)

Hallo,

an den Dateien musst du ja auch nichts ändern, die Semaphore war lediglich gedacht um dem Script _mitzuteilen_ das die Übertragung der eigentlichen Datei abgeschlossen ist.

Also wenn du auf dem Zielsystem (deinem Embedded) nichts ausführen kannst, dann bin ich auch ratlos *sorry*


----------



## Tikonteroga (14. Mai 2012)

Hallo,

ich glaube jetzt kam es zu einem Missverständnis. Deshalb beschreibe ich die Problemstellung etwas genauer.

Also es gibt über 100 eingebettete Systeme, die in der Rolle eines Clients größere Datenmengen über SCP/SSH an einen Server übertragen. Dabei bestehen die Daten aus einer Handvoll Dateien mit einem unterschiedlichem aber vorgegebenen Datentyp.

Durch eine Änderung in der Verwendung dieser eingebetteten Systeme werden die Daten nach einer gewissen Zeit immer in jeweils einer neuen Datei gespeichert. Es werden dann also mehrere Datensätze auf den Server übertragen.

Die eingebetteten Systeme übertragen jetzt als mehrere Datensätze auf den Server. Diese müssen zu einem Datensatz zusammengeführt werden, damit nachfolgende Verarbeitungsfunktionen nicht verändert werden müssen.

Ich wollte jetzt Lösungen vermeiden, bei denen irgendwelche Prozesse zyklisch das Verzeichnis überwachten und auf die eingehenden Datensätze reagieren. Ich Suche eine Möglichkeit, bei der ein Skript gestartet wird nach dem ein Client seine Daten vollständig übertragen hat ... also Ereignisgesteuert.


----------



## DL111 (13. September 2012)

Hallo imweasel. Habe grade das gleiche Problem, das ich mit scp grosse Datenmengen versenden muss und will bei einer semaphore ein event auslösen. Perl könnte ic hda ausführen. Wäre sehr an deine Lösung interessiert.... Viele Grüße


----------



## erik s. (17. September 2012)

Unter welchem OS läuft denn der Server?
Falls es ein Linux-System ist, hätte ich da eine Idee: Jedem Systemuser ist in der /etc/passwd eine Shell zuordenbar. Anstelle dessen kann man auch ein Skript setzen, welches vor und nach dem eigentlichen Öffnen der Shell bestimmte Aktionen ausführen kann.

/etc/passwd

```
...
karl:x:1001:1001:,,,:/home/karl:/home/karl/bin/start.sh
```

/home/karl/bin/start.sh

```
#! /bin/bash

echo "Du bist nun eingeloggt"
/bin/bash
echo "Du hast dich ausgeloggt"
```

Vielleicht kann die Idee noch jemand fortführen. Falls es sich tatsächlich um einen Linux-Server handeln sollte, würde ich das Thema auch verschieben lassen ins entsprechende Forum.


----------

