Scripting di un caricamento batch sFTP ogni 1 minuto


8

Voglio registrare video di una parte della mia casa con una webcam mentre sono via per qualche giorno per cercare di assicurarmi che tutti gli hamburger siano fotografati e che la foto sia caricata sul mio server prima ancora che se ne rendano conto.

Ho installato una webcam per lo streaming di filmati usando mjpg_streamer. Funziona e lo streaming è OK.

È possibile eseguire un'acquisizione fissa dallo stream ogni volta che si desidera chiamare "FileName.jpg":

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

Ho un server FTP Amazon con Amazon Web Services e accesso FTP tramite sFTP. Attualmente sono connesso usando il plug-in FireFTP di Firefox, quindi funziona. L'idea è di lasciare il computer in esecuzione con la connessione attiva.

Vorrei scrivere script per scattare una foto dallo stream ogni 1 minuto e fare in modo che l'immagine venga caricata sul mio server tramite la connessione FTP in tempo reale e che il file originale sia eliminato dal mio PC in modo che il prossimo salverà O oppure aggiungi un numero alla fine di ogni file e poi FTP su. ad es. FileName1.jpeg, Filename2.jpeg.

Ho cercato su Google per ore e anche se ci sono un sacco di post sullo scripting di un caricamento FTP, non riesco a trovare alcun flusso costante di upload ... cioè "Guarda questa cartella, carica il contenuto ogni 1 minuto e poi un minuto dopo carica i nuovi contenuti ".

Immagino di aver bisogno di uno script bash che:

  • mantenere un contatore in modo che ogni nuovo file creato abbia un nome diverso
  • Invia quel nome file a "wget http://127.0.0.1:8080/?action=snapshot -O FileName XX .jpg" ogni 30 secondi o 1 minuto
  • Carica il FileName XX .jpg sul server FTP

Ma non ho idea di come farlo! Qualcuno può dirigermi? O qualcuno sa come fare con FileZilla o qualcosa del genere (che non può guardare una cartella AFAIK: https://forum.filezilla-project.org/viewtopic.php?t=41609 ?


1
Perché eseguire un server FTP in EC2, quando è possibile utilizzare S3 e il client CLI AWS per il caricamento di file a una frazione del costo?
Trognandro

Ho uno di quelli gratuiti dopo. Se quello che hai citato fosse migliore per il compito, ne userei uno comunque?
Gizmo_the_Grande

Copiare i file su ftp con winscp è come 5 righe, vedi il loro sito web.
jiggunjer,

Ed è per Windows. Stiamo parlando di Linux qui.
Gizmo_the_Great

@Gizmo_the_Great È sicuramente quello che vorrei usare.
Trognandro

Risposte:


4

Il mio primo consiglio sarebbe quello di nominare i file usando la data e l'ora in cui sono stati presi. In questo modo non sarà necessario mantenere un contatore da nessuna parte, il che sarebbe difficile in uno script che non viene eseguito continuamente poiché le sue variabili verrebbero ripristinate su ogni chiamata. È possibile memorizzare le variabili in file, ma è più semplice se si assicura che i nomi non si scontrino. Qualcosa come wget http://127.0.0.1:8080/?action=snapshot -O "Snapshot-$(date).jpg"se stai usando Bash. (Scusate se la sintassi non funziona, non sono un esperto di Bash e sto scrivendo questo nel mio telefono.)

Come hai menzionato, ci sono diversi tutorial su scripting caricamenti FTP disponibili. Almeno uno di essi avrebbe dovuto includere un esempio che carica i file in base a un modello, ad esempio "Istantanea - *. Jpg", in cui il carattere jolly corrisponderebbe al timestamp. Oppure, potresti puntare il programma FTP (come lftp o ncftp, che hanno binari pensati per lo scripting) per caricare tutto in una determinata cartella. Quindi cancellare la cartella se il programma ha avuto esito positivo. In questo modo puoi eseguire il tuo script tutte le volte che vuoi utilizzando cron o un timer di sistema e avere la flessibilità necessaria per provare sempre a caricare qualsiasi file che non è riuscito con la successiva esecuzione.

C'è anche un software progettato per svolgere questo compito e altro ancora da solo. Uno di questi programmi, che ho usato da solo, si chiama semplicemente "motion" ed è disponibile per la maggior parte delle distribuzioni. Ha innesco di movimento incorporato (registrazione e / o acquisizione di istantanee) o modalità continue. Può richiedere un po 'di CPU in sistemi come un Raspberry-Pi, ma sicuramente funziona.

Se vuoi intensificarlo un po ', magari eseguire più telecamere remote / locali e avere il rilevamento del movimento scaricato su una macchina centrale più potente, guarda Zoneminder. La configurazione richiede più tempo ed è, per la mia esperienza, esigente che tu abbia impostato manualmente le risoluzioni corrette sui feed della videocamera, ma può essere programmato in una certa misura.


1

Vorrei utilizzare AWS S3 invece di un server FTP in EC2 e lo strumento AWS CLI per caricare i file. È una soluzione molto più leggera che non richiede l'amministrazione dei sistemi. S3 offre una memoria molto più duratura rispetto ai volumi per EC2.

Download dello strumento: https://aws.amazon.com/cli/

Documenti pertinenti: http://docs.aws.amazon.com/cli/latest/reference/s3/

Puoi creare un utente che può caricare solo sul bucket S3 usando IAM (quindi i criminali non possono cancellare i file!)

Realizzerei questo compito creando uno script bash (o perl, node.js, ruby, powershell ?, ...) che chiama wget e genera un nome file con il datetime. Chiamare aws s3 cp ...in un ciclo for per caricare tutti i file nella cartella. Nel ciclo, ad ogni aws s3 cpchiamata riuscita per ciascun file, spostarlo in una cartella di archivio da salvare anche localmente. Se non desideri un archivio locale, usa aws s3 mvper eliminare automaticamente le cose che sono già state caricate.


Ottimo consiglio S Bailey. Alla fine ho seguito questa idea e ho incorporato il resto. Grazie per il consiglio!
Gizmo_the_Grande

1

Signori - un grande grazie a tutto ciò che ha aiutato. In parte, tutti i tuoi suggerimenti mi hanno aiutato a raggiungere il risultato finale. Quindi ti ho dato tutto il merito per le risposte, ma ho pubblicato la mia risposta qui sotto nella speranza che sia utile per gli altri. Mi rendo conto che generalmente non è una cosa fatta, ma in questo caso ci sono molte aree per formare la soluzione, quindi ho legato tutto in uno di seguito.

Installa i servizi necessari per utilizzare AWS S3

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

Iscriviti al servizio AWS S3 con il tuo account Amazon: https://aws.amazon.com/s3/

Definisci la nuova chiave di accesso per il tuo account utente tramite "Chiavi di accesso -> Crea nuova chiave di accesso" e scarica il file CSV quando richiesto. In caso contrario, non sarà possibile utilizzare le funzioni S3 della riga di comando: https://console.aws.amazon.com/iam/home?#security_credential

Apri il file ROOTKEY.CSV e copia, quindi incolla il valore AccessKeyID contenuto e il valore SecretKey quando richiesto quando avvii 'aws configure', che avvia dalla riga di comando prima di utilizzare AWS con Linux.

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

Test è possibile connettersi e caricare un file con un file sample.txt: > aws s3 mv ~/SourceFolder/sample.txt s3://NameOfYourAWSS3Bucket/ AFolderYouHaveCreated

Scarica e installa mjpg_streamer seguendo le istruzioni di compilazione qui: https://github.com/jacksonliam/mjpg-streamer#building--installazione Una volta terminato, vai alla sua cartella

> cd mjpg_streamer

Avvia lo streamer mjpg:

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

Verificare che sia in esecuzione visitando il seguente collegamento nel browser Web:

http://127.0.0.1:8080/stream.html

Prendi un singolo file con data e ora (e salvalo nella directory locale da cui viene eseguito) con:

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

Questo creerà un file nella sottocartella "www" della cartella mjpeg_streamer, chiamato "output-16-09-01-22-35-30.jpg" se eseguito alle 22:35 il 1 settembre 2016.

Crea un nuovo script bash (come MyScript.sh) e concedi le autorizzazioni eseguibili e copia il contenuto in basso in esso. Una volta eseguito, creerà un JPEG timestamp ogni 5 secondi fino a quando la data corrente diventa la data di fine specificata. In questo caso, inizia alla data A e termina alla data B. Sostituisci le tue date.

Copia questo nello script, sostituendo i percorsi rilevanti:

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

Suggerimenti per miglioramenti sono benvenuti.

Inoltre, puoi verificare lo stato di avanzamento della tua archiviazione in AWS S3 con

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

L'ho lasciato sparare per due ore ogni 10 secondi e ha generato 74 Mb di upload. Quindi lavoro a 6.5Gb per una settimana - meno del livello di prezzi per il servizio in cui i costi aumentano, che penso sia di 8Gb.

Grazie ancora.


1
Per quanto riguarda i problemi di utilizzo dello spazio, S3 consente di impostare le regole del ciclo di vita per gli oggetti che li sposteranno in un deposito più economico come il ghiacciaio (o semplicemente li elimineranno) dopo un periodo di tempo specificato. Il tuo script di upload è più semplice di quanto immaginassi, il mio sarebbe ... questo è un complimento. Grazie per aver pubblicato l'intera soluzione!
Trognandro
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.