Création d'un script de téléchargement par lots sFTP toutes les 1 minute

8

Je veux enregistrer une vidéo d'une partie de ma maison avec une webcam pendant que je suis absent pendant quelques jours pour essayer de m'assurer que tous les burgalers sont photographiés et que la photo est téléchargée sur mon serveur avant même qu'ils ne s'en rendent compte.

J'ai installé une webcam pour diffuser des images en utilisant mjpg_streamer. Cela fonctionne et est en streaming OK.

Il est possible de prendre une capture fixe à partir du flux chaque fois que vous le souhaitez appelé «FileName.jpg»:

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

J'ai un serveur FTP Amazon avec Amazon Web Services et un accès FTP en utilisant sFTP. Je suis actuellement connecté avec le plugin FireFTP de Firefox, donc ça marche. L'idée est de laisser l'ordinateur fonctionner avec la connexion en direct.

Je voudrais scripter la prise d'une photo du flux, disons toutes les 1 minute et la télécharger sur mon serveur via la connexion FTP en direct, et soit supprimer le fichier d'origine de mon PC afin que la suivante enregistre O ou ajoutez un numéro à la fin de chaque fichier, puis transférez-le par FTP. par exemple FileName1.jpeg, Filename2.jpeg.

J'ai fait des recherches sur Google pendant des heures et bien qu'il y ait beaucoup de messages sur le scriptage d'un téléchargement FTP, je ne trouve aucun flux constant de téléchargement ... ie "Regardez ce dossier, téléchargez le contenu toutes les 1 minute puis une minute plus tard mettre en ligne tout nouveau contenu ".

Je suppose que j'ai besoin d'un script bash qui:

  • garder un compteur pour que chaque fichier nouvellement créé ait un nom différent
  • Envoyez ce nom de fichier au "wget http://127.0.0.1:8080/?action=snapshot -O FileName XX .jpg" toutes les 30 secondes ou 1 minute
  • Téléchargez le FileName XX .jpg sur le serveur FTP

Mais je ne sais pas comment faire ça! Quelqu'un peut-il me diriger? Ou quelqu'un connaît-il un moyen de faire avec FileZilla ou quelque chose (qui ne peut pas regarder un dossier AFAIK: https://forum.filezilla-project.org/viewtopic.php?t=41609 ?

Gizmo_the_Great
la source
1
Pourquoi exécuter un serveur FTP dans EC2, alors que vous pouvez utiliser S3 et le client AWS CLI pour les téléchargements de fichiers à une fraction du coût?
trognanders
J'ai l'un des afaik gratuits. Si celui que vous mentionnez serait mieux pour la tâche, j'en utiliserais un cependant?
Gizmo_the_Great
Copier des fichiers sur ftp avec winscp est comme 5 lignes, voir leur site web.
jiggunjer
Et c'est pour Windows. Nous parlons de Linux ici.
Gizmo_the_Great
@Gizmo_the_Great C'est certainement ce que j'utiliserais.
trognanders

Réponses:

4

Mon premier conseil serait de nommer les fichiers en utilisant la date et l'heure de leur prise. De cette façon, vous n'aurez pas besoin de garder un compteur n'importe où, ce qui serait difficile dans un script qui ne s'exécute pas en continu car ses variables seraient réinitialisées à chaque appel. Vous pouvez stocker les variables dans des fichiers, mais c'est plus facile si vous vous assurez que les noms ne se heurteront pas. Quelque chose comme wget http://127.0.0.1:8080/?action=snapshot -O "Snapshot-$(date).jpg"si vous utilisez Bash. (Désolé si la syntaxe ne fonctionne pas, je ne suis pas un expert Bash et je tape ceci dans mon téléphone.)

Comme vous l'avez mentionné, plusieurs didacticiels sur les scripts de téléchargement FTP sont disponibles. Au moins l'un d'entre eux aurait dû inclure un exemple qui télécharge des fichiers par un modèle, tel que "Snapshot - *. Jpg", où le caractère générique correspondrait à l'horodatage. Ou, vous pouvez pointer le programme FTP (tel que lftp ou ncftp, qui ont des binaires destinés aux scripts) pour tout télécharger dans un certain dossier. Essuyez ensuite le dossier si le programme a réussi. De cette façon, vous pouvez exécuter votre script aussi souvent que vous le souhaitez à l'aide de cron ou d'une minuterie systemd, et le faire être suffisamment flexible pour toujours essayer de télécharger tous les fichiers qui n'ont pas réussi lors de son exécution ultérieure.

Il existe également des logiciels conçus pour effectuer cette tâche, et plus encore, par eux-mêmes. Un de ces programmes, que j'ai utilisé moi-même, est simplement appelé "motion" et est disponible pour la plupart des distributions. Il a un déclenchement de mouvement intégré (enregistrer et / ou prendre des instantanés) ou des modes continus. Il peut être un peu gourmand en CPU sur des systèmes comme un Raspberry-Pi, mais cela fonctionne certainement.

Si vous voulez accélérer un peu, peut-être exécuter plusieurs caméras distantes / locales et faire décharger la détection de mouvement sur une machine centrale plus puissante, regardez Zoneminder. Cela prend plus de temps à configurer et, selon mon expérience, il est difficile de définir manuellement les résolutions correctes sur les flux de votre caméra, mais cela peut être scripté dans une certaine mesure.

TwoD
la source
1

J'utiliserais AWS S3 au lieu d'un serveur FTP dans EC2 et l'outil AWS CLI pour télécharger les fichiers. Il s'agit d'une solution beaucoup plus légère ne nécessitant aucune administration système. S3 offre un stockage beaucoup plus durable que les volumes pour EC2.

Téléchargement d'outil: https://aws.amazon.com/cli/

Documents pertinents: http://docs.aws.amazon.com/cli/latest/reference/s3/

Vous pouvez créer un utilisateur qui peut uniquement télécharger vers le compartiment S3 en utilisant IAM (afin que les criminels ne puissent pas effacer les fichiers!)

J'accomplirais cette tâche en créant un script bash (ou perl, node.js, ruby, powershell ?, ...) qui appelle wget et renvoie un nom de fichier avec datetime. Appelez aws s3 cp ...dans une boucle for pour télécharger tous les fichiers du dossier. Dans la boucle, à chaque aws s3 cpappel réussi pour chaque fichier, déplacez-le dans un dossier d'archive pour être également enregistré localement. Si vous ne voulez pas qu'une archive locale soit utilisée aws s3 mvpour purger automatiquement les éléments déjà téléchargés.

trognanders
la source
Excellent conseil S Bailey. J'ai finalement adopté cette idée et j'ai intégré le reste. Merci pour le conseil!
Gizmo_the_Great
1

Messieurs - un grand merci à tous ceux qui ont aidé. En partie, toutes vos suggestions m'ont aidé à arriver au résultat final. Je vous ai donc donné tout le crédit pour les réponses, mais j'ai posté ma propre réponse ci-dessous dans l'espoir qu'elle soit utile pour les autres. Je me rends compte que ce n'est généralement pas la chose à faire, mais dans ce cas, il existe de nombreux domaines pour former la solution, j'ai donc tout lié en un ci-dessous.

Installez les services nécessaires pour utiliser AWS S3

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

Inscrivez-vous au service AWS S3 avec votre propre compte Amazon: https://aws.amazon.com/s3/

Définissez une nouvelle clé d'accès pour votre compte d'utilisateur via «Clés d'accès -> Créer une nouvelle clé d'accès» et téléchargez le fichier CSV lorsque vous y êtes invité. Si vous ne le faites pas, vous ne pourrez pas utiliser les fonctions de ligne de commande S3: https://console.aws.amazon.com/iam/home?#security_credential

Ouvrez le fichier ROOTKEY.CSV et copiez puis collez la valeur AccessKeyID contenue et la valeur SecretKey lorsque vous y êtes invité lorsque vous lancez 'aws configure', que vous lancez à partir de la ligne de commande avant d'utiliser AWS avec Linux.

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

Testez que vous pouvez vous connecter et télécharger un fichier avec un fichier sample.txt: > aws s3 mv ~/SourceFolder/sample.txt s3://NameOfYourAWSS3Bucket/ AFolderYouHaveCreated

Téléchargez et installez mjpg_streamer en suivant les instructions de construction ici: https://github.com/jacksonliament/mjpg-streamer#building--installation Une fois cela fait, accédez à son dossier

> cd mjpg_streamer

Démarrez le streamer mjpg:

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

Vérifiez qu'il fonctionne en visitant le lien suivant dans votre navigateur Web:

http://127.0.0.1:8080/stream.html

Prenez un seul fichier horodaté (et enregistrez-le dans le répertoire local à partir duquel il est exécuté) avec:

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

Cela créera un fichier dans le sous-dossier 'www' de votre dossier mjpeg_streamer, appelé 'output-16-09-01-22-35-30.jpg' s'il est exécuté à 22h35 le 1er septembre 2016.

Créez un nouveau script bash (tel que MyScript.sh) et donnez-lui des autorisations exécutables et copiez-y le contenu en bas. Lorsqu'il est exécuté, il crée un JPEG horodaté toutes les 5 secondes jusqu'à ce que la date actuelle devienne la date de fin spécifiée. Dans ce cas, il commence à la date A et se termine à la date B. Remplacez vos propres dates.

Copiez ceci dans le script, en substituant les chemins pertinents:

#!/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

Suggestions d'améliorations bienvenues.

En outre, vous pouvez vérifier la progression de votre stockage dans l'AWS S3 avec

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

Je l'ai laissé pendant deux heures à tirer toutes les 10 secondes et il a généré 74 Mo de téléchargements. Je travaille donc à 6,5 Go pendant une semaine - moins que le niveau de prix pour le service où les coûts entrent en jeu, ce qui, je pense, est de 8 Go.

Merci encore.

Gizmo_the_Great
la source
1
En ce qui concerne les problèmes d'utilisation de l'espace, S3 vous permet de définir des règles de cycle de vie pour les objets qui les déplaceront vers un stockage moins cher comme glacier (ou tout simplement les supprimer) après un temps spécifié. Votre script de téléchargement est plus simple que ce que j'imaginais le mien ... c'est un compliment. Merci d'avoir posté toute la solution!
trognanders