Skripten eines sFTP-Batch-Uploads alle 1 Minute

8

Ich möchte ein Video von einem Teil meines Hauses mit einer Webcam aufnehmen, während ich ein paar Tage weg bin, um sicherzustellen, dass alle Burger fotografiert und das Foto auf meinen Server hochgeladen werden, bevor sie es überhaupt bemerken.

Ich habe eine Webcam eingerichtet, um Filmmaterial mit mjpg_streamer zu streamen. Das funktioniert und läuft OK.

Es ist möglich, eine Standbildaufnahme aus dem Stream zu erstellen, wann immer Sie "FileName.jpg" möchten:

wget http://127.0.0.1:8080/?action=snapshot -O FileName.jpg 

Ich habe einen Amazon FTP-Server mit Amazon Web Services und FTP-Zugriff über sFTP. Ich bin derzeit mit dem Firefox-Plugin von Firefox verbunden, damit das funktioniert. Die Idee ist, den Computer mit der Verbindung live laufen zu lassen.

Ich möchte die Aufnahme eines Bildes aus dem Stream alle 1 Minute per Skript ausführen und das Bild über die Live-FTP-Verbindung auf meinen Server hochladen lassen. Entweder möchte ich die Originaldatei von meinem PC löschen, damit die nächste O speichert oder fügen Sie eine Nummer an das Ende jeder Datei an und senden Sie sie per FTP. zB FileName1.jpeg, Filename2.jpeg.

Ich habe stundenlang gegoogelt und obwohl es viele Beiträge zum Skripten eines FTP-Uploads gibt, kann ich keinen konstanten Stream zum Hochladen finden ... dh "Diesen Ordner ansehen, den Inhalt alle 1 Minute und dann eine Minute später hochladen Laden Sie alle neuen Inhalte hoch ".

Ich brauche wohl ein Bash-Skript, das:

  • Behalten Sie einen Zähler bei, damit jede neu erstellte Datei einen anderen Namen erhält
  • Senden Sie diesen Dateinamen alle 30 Sekunden oder 1 Minute an "wget http://127.0.0.1:8080/?action=snapshot -O FileName XX .jpg"
  • Laden Sie den Dateinamen XX .jpg auf den FTP-Server hoch

Aber ich habe keine Ahnung, wie das geht! Kann mich jemand leiten? Oder kennt jemand eine Möglichkeit, mit FileZilla oder etwas anderem umzugehen (die einen Ordner AFAIK nicht sehen kann: https://forum.filezilla-project.org/viewtopic.php?t=41609 ?

Gizmo_the_Great
quelle
1
Warum einen FTP-Server in EC2 ausführen, wenn Sie S3 und den AWS CLI-Client zum Hochladen von Dateien zu einem Bruchteil der Kosten verwenden können?
Trognanders
Ich habe einen der freien Afaik. Wenn die, die Sie erwähnen, besser für die Aufgabe wäre, würde ich trotzdem eine verwenden?
Gizmo_the_Great
Das Kopieren von Dateien auf FTP mit Winscp entspricht 5 Zeilen, siehe deren Website.
Jiggunjer
Und es ist für Windows. Wir sprechen hier von Linux.
Gizmo_the_Great
@ Gizmo_the_Great Es ist sicherlich das, was ich verwenden würde.
Trognanders

Antworten:

4

Mein erster Tipp wäre, die Dateien anhand des Datums und der Uhrzeit ihrer Aufnahme zu benennen. Auf diese Weise müssen Sie nirgendwo einen Zähler aufbewahren, was in einem Skript, das nicht kontinuierlich ausgeführt wird, schwierig wäre, da seine Variablen bei jedem Aufruf zurückgesetzt werden. Sie könnten die Variablen in Dateien speichern, aber es ist einfacher, wenn Sie sicherstellen, dass die Namen nicht kollidieren. So etwas wie wget http://127.0.0.1:8080/?action=snapshot -O "Snapshot-$(date).jpg"wenn Sie Bash verwenden. (Entschuldigung, wenn die Syntax nicht funktioniert, ich bin kein Bash-Experte und tippe dies in mein Telefon ein.)

Wie Sie bereits erwähnt haben, stehen verschiedene Tutorials zum Erstellen von Skripten für FTP-Uploads zur Verfügung. Mindestens einer von ihnen sollte ein Beispiel enthalten, das Dateien nach einem Muster hochlädt, z. B. "Snapshot - *. Jpg", bei dem der Platzhalter mit dem Zeitstempel übereinstimmt. Sie können auch das FTP-Programm (z. B. lftp oder ncftp mit Binärdateien für die Skripterstellung) so einstellen, dass alles in einen bestimmten Ordner hochgeladen wird. Löschen Sie dann den Ordner, wenn das Programm erfolgreich war. Auf diese Weise können Sie Ihr Skript so oft ausführen, wie Sie möchten, indem Sie cron oder einen systemd-Timer verwenden. Es ist flexibel genug, um immer zu versuchen, Dateien hochzuladen, die zum späteren Zeitpunkt nicht erfolgreich waren.

Es gibt auch Software, die für diese Aufgabe entwickelt wurde, und vieles mehr. Ein solches Programm, das ich selbst verwendet habe, heißt einfach "motion" und ist für die meisten Distributionen verfügbar. Es verfügt über eine integrierte Bewegungsauslösung (Aufzeichnen und / oder Aufnehmen von Schnappschüssen) oder einen kontinuierlichen Modus. Auf Systemen wie einem Raspberry-Pi kann es etwas CPU-intensiv sein, aber es funktioniert auf jeden Fall.

Wenn Sie die Leistung etwas steigern möchten, möglicherweise mehrere Remote- / lokale Kameras ausführen und die Bewegungserkennung auf eine leistungsstärkere Zentralmaschine auslagern möchten, schauen Sie sich Zoneminder an. Das Einrichten dauert länger und ist meiner Erfahrung nach wählerisch, wenn Sie die richtigen Auflösungen für Ihre Kamera-Feeds manuell einstellen. Es kann jedoch bis zu einem gewissen Grad per Skript ausgeführt werden.

TwoD
quelle
1

Ich würde AWS S3 anstelle eines FTP-Servers in EC2 und das AWS CLI-Tool verwenden, um die Dateien hochzuladen. Es ist eine viel leichtere Lösung, die keine Systemadministration erfordert. S3 bietet viel dauerhafteren Speicher als die Volumes für EC2.

Tool herunterladen: https://aws.amazon.com/cli/

Relevante Dokumente: http://docs.aws.amazon.com/cli/latest/reference/s3/

Sie können einen Benutzer erstellen, der nur mit IAM in den S3-Bucket hochladen kann (damit die Kriminellen die Dateien nicht löschen können!).

Ich würde diese Aufgabe erfüllen, indem ich ein Bash-Skript (oder Perl, Node.js, Ruby, Powershell?, ...) erstelle, das wget aufruft und einen Dateinamen mit dem Datum / Uhrzeit ausgibt. Rufen Sie aws s3 cp ...eine for-Schleife auf, um alle Dateien im Ordner hochzuladen. aws s3 cpVerschieben Sie die Datei bei jedem erfolgreichen Aufruf für jede Datei in einen Archivordner, um sie auch lokal zu speichern. Wenn Sie nicht möchten, dass ein lokales Archiv aws s3 mvdie bereits hochgeladenen Objekte automatisch magisch löscht.

Trognander
quelle
Großartiger Rat S Bailey. Am Ende bin ich dieser Idee gefolgt und habe den Rest aufgenommen. Danke für den Tipp!
Gizmo_the_Great
1

Herren - ein großes Dankeschön an alle, die geholfen haben. Zum Teil haben mir alle Ihre Vorschläge geholfen, zum Endergebnis zu gelangen. Ich habe Ihnen alle Anerkennung für die Antworten gegeben, aber meine eigene Antwort unten veröffentlicht, in der Hoffnung, dass sie für andere nützlich ist. Mir ist klar, dass dies im Allgemeinen nicht der Fall ist, aber in diesem Fall gibt es viele Bereiche, um die Lösung zu bilden. Deshalb habe ich alles unten in einem zusammengefasst.

Installieren Sie die Dienste, die für die Verwendung von AWS S3 erforderlich sind

# > sudo apt-get install python-pip
# > sudo pip install awscli

Melden Sie sich mit Ihrem eigenen Amazon-Konto für den AWS S3-Service an: https://aws.amazon.com/s3/

Definieren Sie einen neuen Zugriffsschlüssel für Ihr Benutzerkonto über "Zugriffsschlüssel -> Neuen Zugriffsschlüssel erstellen" und laden Sie die CSV-Datei herunter, wenn Sie dazu aufgefordert werden. Wenn Sie dies nicht tun, können Sie die Befehlszeilenfunktionen von S3 nicht verwenden: https://console.aws.amazon.com/iam/home?#security_credential

Öffnen Sie die Datei ROOTKEY.CSV, kopieren Sie den enthaltenen AccessKeyID-Wert und den SecretKey-Wert und fügen Sie ihn ein, wenn Sie beim Starten von 'aws configure', das Sie über die Befehlszeile starten, bevor Sie AWS unter Linux verwenden, dazu aufgefordert werden.

> aws configure
Enter your access key and secret key when asked. You can leave the third and fourth empty or as 'None'. 

Testen Sie, ob Sie eine Datei mit einer sample.txt-Datei verbinden und hochladen können: > aws s3 mv ~/SourceFolder/sample.txt s3://NameOfYourAWSS3Bucket/ AFolderYouHaveCreated

Laden Sie mjpg_streamer herunter und installieren Sie es gemäß den Build-Anweisungen hier: https://github.com/jacksonliam/mjpg-streamer#building--installation Navigieren Sie anschließend zu seinem Ordner

> cd mjpg_streamer

Starten Sie den mjpg-Streamer:

> mjpg_streamer -i "./input_uvc.so -f 15 -r 1280x960" -o "./output_http.so -w ./www"

Überprüfen Sie, ob es ausgeführt wird, indem Sie den folgenden Link in Ihrem Webbrowser besuchen:

http://127.0.0.1:8080/stream.html

Nehmen Sie eine einzelne Datei mit Datums- und Zeitstempel (und speichern Sie sie in dem lokalen Verzeichnis, aus dem sie ausgeführt wird) mit:

> wget http://127.0.0.1:8080/?action=snapshot -O output-$(date +"%Y-%m-%d-%k-%M-%S").jpg

Dadurch wird eine Datei im Unterordner 'www' Ihres Ordners mjpeg_streamer mit dem Namen 'output-16-09-01-22-35-30.jpg' erstellt, wenn sie am 1. September 2016 um 22:35 Uhr ausgeführt wird.

Erstellen Sie ein neues Bash-Skript (z. B. MyScript.sh), erteilen Sie ausführbare Berechtigungen und kopieren Sie den Inhalt unten hinein. Bei der Ausführung wird alle 5 Sekunden ein JPEG mit Zeitstempel erstellt, bis das aktuelle Datum das angegebene Enddatum erreicht. In diesem Fall beginnt es am Datum A und endet am Datum B. Ersetzen Sie Ihre eigenen Daten.

Kopieren Sie dies in das Skript und ersetzen Sie relevante Pfade:

#!/bin/bash  
     SOURCE="/home/YourUser/YourSourceFolder"
     DESTINATION="s3://YourS3Bucket/DestinationFolder"
     input_start=2016-8-29
     input_end=2016-9-9
     startdate=$(date -I -d "$input_start") || exit -1
     enddate=$(date -I -d "$input_end")     || exit -1

     d="$startdate"

       while [ "$d" != "$enddate" ]; do 
       sleep 5
         wget "http://127.0.0.1:8080/?action=snapshot" -O output-$(date +"%Y-%m-%d-%k-%M-%S")'.jpg';
         aws s3 mv $SOURCE $DESTINATION --recursive;
       done

Verbesserungsvorschläge sind willkommen.

Sie können auch den Fortschritt Ihres Speichers im AWS S3 mit überprüfen

aws s3 ls s3://yourbucketname --recursive --human-readable --summarize

Ich ließ es zwei Stunden lang alle 10 Sekunden feuern und es erzeugte 74 MB Uploads. Ich rechne damit für eine Woche mit 6,5 GB - weniger als die Preisstufe für den Service, bei dem die Kosten anfallen, was meiner Meinung nach 8 GB beträgt.

Danke noch einmal.

Gizmo_the_Great
quelle
1
In Bezug auf Speicherplatzprobleme können Sie in S3 Lebenszyklusregeln für Objekte festlegen, die diese nach einer bestimmten Zeit in einen günstigeren Speicher wie Gletscher verschieben (oder einfach löschen). Ihr Upload-Skript ist einfacher als ich es mir vorgestellt habe ... das ist ein Kompliment. Vielen Dank, dass Sie die gesamte Lösung veröffentlicht haben!
Trognanders