FTP - SFTP Bridge mit RasPi?
Ich habe folgendes "Problem".
Ich habe eine Überwachungskamera, die leider nur FTP Upload anbietet.
SFTP geht leider nicht.
Dementsprechend würde ich gerne den RasPi dazwischen schalten als Bridge.
Der RasPi soll dementsprechend per FTP die Daten entgegen nehmen und dann wieder per SFTP auf meinen Server hochladen.
Jetzt ist meine Frage, wie ich das am besten umsetze.
Hab da schon etwas gegoogelt aber leider kein Server/Client seitiges Programm gefunden außer ein Client der Bridging Funktion hat.
Aber der RasPi wird rein per CLI gesteuert und hat keine UI.
Die andere Möglichkeit wäre Scripting, wobei ich das etwas schwieriger bzw. zu komplex einschätze und außerdem mit hoher Fehleranfälligkeit behaftet sein kann.
Die 3. Möglichkeit, welche ich von der Idee her nicht schlecht fand, war FTP Server dann Upload auf Ordner und dann mit SSHfs an den nächsten Server uploaden. Ist halt die Frage wie gut das funktioniert.
Außerdem besteht da evtl. das Problem, wenn ich die Verzeichnisse Synchronisiere, dass auf dem PI zu viel Speicher verbraucht wird.
Mein Ziel ist es, die Video Sequenzen der Cam auf meinen Server hochzuladen und diese dort nach gewisser Zeit automatisch zu löschen.
Die Sache mit dem RasPi ist außerdem die SD Karte, die problematisch wird.
Ich möchte die Daten nicht durchgehend auf dem PI speichern sondern diese eigentlich direkt zum Server durchleiten.
Um das Problem mit der SD Karte und der Haltbarkeit und dem IO zu umgehen würde ich ein RAM-Disk setzen. Das würde für ein paar Videos in der Upload Queue reichen. Dementsprechend keine Daten auf dem PI und nur auf meinem Server. Kein Problem mit IO und Durchsatz sowie der Haltbarkeit der SD.
Jemand Ideen, wie man das Vorhaben am besten und möglichst einfach umsetzen kann?
Bzw irgendwer Erfahrung darin?
Freue mich über gute Antworten und danke schon Mal im Voraus.
2 Antworten
SSHFS wäre auch ne Idee von mir gewesen.
Schau dir mal an wie das SSHFS intern funktioniert: https://superuser.com/questions/423906/does-sshfs-copy-the-files-locally-all-at-once-or-only-when-i-cd-into-them
Es wird nie alles rüberkopiert, das heißt beide Endpunkte haben nicht unbedingt alle Daten komplett gespeichert.
Das wäre zwar jetzt noch nicht die Ideallösung, aber ich kann mir folgendes vorstellen:
- Raspi mounted via sshfs ein verzeichnis auf dem server (hierbei werden NICHT alle Dateien kopiert, sondern erst, wenn man drauf zugreift)
- Client sendet Datei via FTP an den Raspi in entsprechendes Verzeichnis (FTP root = sftp mountdir)
- wenn ftp connection closed:
- sshfs mount wird unmounted
- das working dir auf dem raspi wird geleert (kann auch gern ne ramdisk sein)
Jetzt musst du halt nur noch dafür sorgen, dass genau das automatisiert passiert. Vielleicht bietet dein ftpd ja hooks oder du verwendest einen filesystem watcher.
aber irgendwo scripten und dich dranhängen musst du leider.
Okey, danke schon Mal für die Antwort. So in der Art hab ich mir das auch vorgestellt. Ist halt die Frage wie SSHFS dann genau funktioniert. Das schaue ich mir dann noch an.
Hab halt nach paar verschiedenen Google Anfragen halt auch keine großartigen Lösungen gefunden außer schlaue antworten wie nimm halt SFTP und warum sollte man noch FTP nehmen aber nun ja..
Werde mir das anschauen und dann gucken wegen dem Scripting. Grundsätzlich ist das Scripting an sich kein Problem aber das halt alles fehlerfrei und korrekt umzusetzen halt n Aufwand.. wäre schön, wenn es schon fertige Client/Server Software gäbe..
Ist halt die Frage wie ich das umsetze mit den Dateien. Da es immer 1 Minuten Videos sind und die natürlich am besten sofort und in der passenden Reihenfolge hochgeladen und dann wieder gelöscht werden sollen.
Daran sehe ich den Knackpunkt das passend umzusetzen.
Bin mir noch nicht ganz sicher wie ich das einrichte.
Theoretisch, wenn ich das richtig verstehe würde ja SSHFS das Verzeichnis naja synchronisieren also im Sinne von dem gemounteten dir.
Heißt, wenn SSHFS ne Datei rein bekommt, lädt die Datei hoch und dann würde ich sie ja löschen und SSHFS auch. Die soll ja nur synchronisiert bzw. hochgeladen werden.
Das einzige was mir noch eingefallen ist, irgendwie per SFTP ne Sync erstellen, die halt nur in eine Richtung durchgehend hochlädt und dann per Script nach einiger Zeit automatisch die Dateien lokal zu löschen.
Wüsste da gerade auch nicht ob man das mit z.B. vsftpd umsetzen kann. Und wie zuverlässig und schnell der Upload dann ist.
Vielleicht hast du oder wer anders ja noch n paar Ideen oder Tipps.
Am aufwendigsten wäre ein Applayer Ptoxying. D.h. der Pi fährt nen Proxy, der aus FTP SFTP macht (spricht was gegen FTPS?).
Deutlich einfacher währe es auf dem Server einen FTP laufen zu lassen und an Loopback zu binden. Der Pi tunnelt dann verschlüsselt (SSH, stunnel, VPN,, ...)
SSHfs könnte man sicherlich auch nutzen.
FTPS verschlüsselt nur die Steuerdaten jedoch nicht die Nutzdaten.
Korrekter wäre: Der Standard forderrt für die Datenverbindung nicht explizit TLS, wenn Client und Server das jedoch machen, dann wird auch die Datenverbindung verschlüsselt.
Was bei FTP beim Tunnels so ein wenig frickelig ist, ist die Sache mit der gesonderten Verbindung, da wirst Du beim FTPd schauen müssen, daß er der Cam (Client) nicht die eigene IP, sondern die des Pi mitteilt - als 'Last Ressort' kann man auch die Pakete umschreiben, aber das würde ich wirklich nur machen, wenn es gar nicht anders klappt.
Danke nochmal für die Info. Dachte halt anfangs immer das FTPS halt wie SFTP ist nur halt das es halt 2 komplett unterschiedliche aufgebaute Programme/Protokolle/Verbindungen sind. Dann hab ich gelesen, das nur Steuerdaten verschlüsselt werden. Das ist irgendwie etwas unzureichend. Aber da jetzt dran Rum frickeln ist auch doof.
Naja die andere Sache die für mich gerade relativ viel versprechend scheint, die ich unter ein paar anderen Suchbegriffen im Forum gefunden habe, ist RSync.
Kenne das zwar grundsätzlich aber bin garnicht auf die Idee gekommen.
Bin gerade Mal dabei das auszutesten. Also man kann da einstellen, dass automatisch die übertragenen Dateien gelöscht werden. Sowie auch nur in eine Richtung übertragen werden kann.
Außerdem kann man wohl einstellen, dass nur neue Dateien hochgeladen werden und das Verzeichnis überprüft wird.
Muss jetzt halt schauen, ob das klappt, wenn ich das per Cron Job jede Minute laufen lasse, ob das dann alles so läuft und wie schnell der Upload ist.
Mit der Option dürfte ja selbst bei gleichzeitigem laufen von dem Befehl trotzdem nur die neuen Dateien die auf dem Remote noch nicht existieren hochgeladen werden.
Hab mir gerade Mal alle Optionen zusammen gesucht.
Probiere dann n Dry Run und teste wie es läuft außerdem packe ich das dann in die RAM Disk.
Bin Mal gespannt. Evtl. wäre das dann die "sauberste" Lösung für den Moment in meinem Fall.
Dann nehme ich halt einfach über FTP die Daten an in das Verzeichnis von RSync.
Stimmt, rsync hat nur eine Verbindung und lässt sich leicht durch ssh tunneln.
Ich bin bei der Frage halt primär davon ausgegangen, daß auf dem Pi nichts abgelegt werden soll, daher eben die Idee direkt FTP durch SSH durchzutunneln, wegen der Cam, die nur FTP macht.
Ja auf dem PI soll das ja auch an sich nicht gespeichert werden. Aber das mit dem Tunneln ist glaube ich noch mehr Aufwand.
Also insgesamt läuft jetzt das ganze wohl zumindest direkt in der Shell.
Daten werden von der Cam auf dem PI in der RAM-Disk abgelegt und dann mit RSync hochgeladen.
An sich funktioniert das ganz gut.
Das einzige Problem welches ich jetzt noch habe, ist der RSync Befehl, der klappt ohne Probleme in der Shell zumindest soweit ich das beobachtet habe. Aber in einer Script Datei per Cron Job hab ich da jetzt ziemlich Rum frickeln müssen. Da der Befehl (exakt der gleiche) im Script nicht lief. Gestern Abend hab ich dann gedacht ich hätte es und dann ist mir aufgefallen, dass komischerweise nur ein Ordner hochgeladen wird, jedoch nicht wie vorher beide.
Außerdem hab ich bemerkt, das die Ordner von RSync nachdem ich diese auf dem Remote Server gelöscht hatte, nicht wieder neu erstellt werden. Vorher ist das aber geschehen.
Ganz komisches Verhalten, welches sich mir nicht erschließt. Gebe ich den Befehl wieder direkt ein, macht es an sich genau das was es soll.
Ziemlich verwirrend.
Vielleicht ein PRoblem mit Shell Expansions. Du sagst script, nutzt Du wirklich ein Script, oder einen Eintrag in der Crontab?
Die Details sind teilweise nciht immer so ganz offensichtlich.
Erst hab ich den Befehl im Crontab eingegeben. Dann dachte ich mir schon, dass das nicht so schön ist und hab's dann in ne Datei gepackt.
Die Shell die im Script genutzt wird ist bash.
Ich kann nachher Mal den Befehl senden, den ich nutze. Bin gerade nicht am PC..
Das muss wohl doch was mit dem Befehl sein.
Das komische ist, das ich bei der Ziel-Pfadangabe Mal n Leerzeichen zwischen dem : machen kann/muss und Mal nicht, damit es funktioniert. Ziemlich seltsam.
Sehr wahrscheinlich hab ich da was falsch gemacht oder was vergessen bzw. übersehen.
Vielleicht etwas falsch gequotet oder ähnliches.
Bin da ein wenig überfragt. Aber meistens ist es eine Kleinigkeit die man dann die ganze Zeit übersieht und sich dann denkt. "Boah wie dumm" 😅
rsync -v -h --progress --stats --ignore-existing --remove-source-files --compress /mnt/ramdisk/Cam/* -r -e "sshpass -p 'yî\`ÃÝíä}' ssh -p12345 USER@IP" :/home/USER/RSYNC/ &>> /home/USER/RSYNC/RSync_Cron.log
Das ist der genutzte Befehl.
Zwei Dinge, die letzten beiden Argumente sidn Source und Dest, dazwischen also keine Optionen, das andere ist, es fehlt der Host.
Ich denke, es müßte eher so aussehen, kann mich aber täuschen:
rsync -v -h --progress --stats --ignore-existing --remove-source-files --compress -r -e "sshpass -p 'yî\`ÃÝíä}' ssh -p12345" /mnt/ramdisk/Cam/* USER@IP:/home/USER/RSYNC/ &>> /home/USER/RSYNC/RSync_Cron.log
Okey, danke schon mal für die Info bzw. die Idee...
Ich hatte schon das Problem, dass ich nicht einfach das Password mit im Bereich User:IP:Verzeichnisch angeben konnte. Deswegen das extra Programm sshpass.
Dementsprechend dachte ich, dass das zusammen angegeben werden muss.
Mit dem Quoten der Sonderzeichen hatte ich auch schon Probleme. Komischerweise funktioniert die Variante wie ich sie habe ja teilweise. Das verwirrt mich ja um so mehr. Wenn es garnicht gehen würde ok aber dieses hin und wieder klappt es und manchmal nicht, macht mich voll verrückt und ich bin dann überfragt. Ich werde deine Variante aber auf jeden Fall ausprobieren und schauen ob es evtl. dann doch daran liegt.
Also ich habe deine Variante auch mit als Fehler angenommen. Tatsächlich haben beide Varianten funktioniert aber ich bin jetzt trotzdem bei deiner geblieben.
Der tatsächliche Fehler den hab ich auf Stack Overflow gefunden nachdem ich dort auch die Frage gestellt habe und mir dann das passende Thema vorgeschlagen wurde, in dem auch einige verschiedene Fehlermöglichkeiten genannt wurden.
Es lag an dem SSH im Keyring des Nutzers.
Dadurch daß der Cron nicht die Rechte hat, kann keine Verbindung aufgebaut werden.
Selbst der Crontab des Root Benutzers kann wohl nicht darauf zugreifen.
Also man muss entweder als Login SSH Keys einsetzen oder wie ich das gemacht habe, einfach einmal den Befehl in der Shell eingeben ohne Passwort, damit man danach gefragt wird und dann nach Eingabe wird der Key beim Benutzer gespeichert als vertrauenswürdig. Danach kann man sich direkt mit dem Passwort in der Shell bzw. Script anmelden.
Dem Cronjob habe ich unter Root dann gesagt dass er sich als mein Benutzer den Befehl ausführen soll.
Und siehe da, es läuft wie es soll.
Jetzt fehlt nur noch die Zeitabfrage der Dateien. Also nur Uploaden älter als 30 Sekunden.
Auf den Kram muss man erstmal kommen. War schon voll am verzweifeln.
Danke auf jeden Fall für die Hilfe.
Interessante Idee. Das müsste ich mir aber auch genauer noch anschauen, da kenne ich mich noch nicht so mit aus.
Also FTPS könnte ich wohl evtl. lokal einsetzen um noch die Steuerdaten zu schützen. Bin mir gerade nicht sicher ob die Kamera das kann.
Was aber gegen FTPS spricht ist, dass ich nicht meine privaten Daten (Bilder/Videos) unverschlüsselt übers Internet übertragen möchte.
FTPS verschlüsselt nur die Steuerdaten jedoch nicht die Nutzdaten.