Skryptowanie przesyłania wsadowego sFTP co 1 minutę


8

Chcę nagrać wideo części mojego domu za pomocą kamery internetowej, podczas gdy jestem nieobecny przez kilka dni, aby upewnić się, że wszyscy burgery są sfotografowani, a zdjęcie przesłane na mój serwer, zanim jeszcze zdadzą sobie z tego sprawę.

Mam skonfigurowaną kamerę internetową do strumieniowego przesyłania materiału za pomocą mjpg_streamer. To działa i streaming OK.

Możliwe jest wzięcie przechwytywania ze strumienia, kiedy tylko chcesz o nazwie „FileName.jpg”:

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

Mam serwer Amazon Amazon z usługami Amazon Web Services i dostępem FTP za pomocą protokołu sFTP. Jestem połączony za pomocą wtyczki Firefox FireFTP, więc to działa. Chodzi o to, aby komputer działał z połączeniem na żywo.

Chciałbym napisać scenariusz robienia zdjęcia ze strumienia, co 1 minutę, a następnie przesłać zdjęcie na mój serwer za pośrednictwem połączenia FTP na żywo, a także usunąć oryginalny plik z mojego komputera, aby następny mógł zapisać O lub dodaj numer na końcu każdego pliku, a następnie prześlij go przez FTP. np. nazwa_pliku1.jpeg, nazwa pliku2.jpeg.

Pracowałem w Google od wielu godzin i chociaż jest mnóstwo wpisów na temat pisania skryptów przesyłania FTP, nie mogę znaleźć nic o stałym strumieniu przesyłania ... tzn. „Oglądaj ten folder, przesyłaj zawartość co minutę, a następnie minutę później prześlij dowolną nową treść ".

Chyba potrzebuję skryptu bash, który:

  • przechowuj licznik, aby każdy nowo utworzony plik otrzymał inną nazwę
  • Wyślij tę nazwę pliku do „wget http://127.0.0.1:8080/?action=snapshot -O nazwa_pliku XX .jpg” co 30 sekund lub 1 minutę
  • Prześlij nazwę pliku XX .jpg na serwer FTP

Ale nie mam pojęcia, jak to zrobić! Czy ktoś może mnie pokierować? A może ktoś wie, jak zrobić FileZilla lub coś takiego (którego nie można obejrzeć w folderze AFAIK: https://forum.filezilla-project.org/viewtopic.php?t=41609 ?


1
Po co uruchamiać serwer FTP w EC2, skoro można używać S3 i klienta AWS CLI do przesyłania plików za ułamek kosztów?
trognanders

Mam jedną z tych darmowych. Jeśli jednak ten, o którym wspominasz, byłby lepszy do zadania, użyłbym jednego?
Gizmo_the_Great

Kopiowanie plików do ftp za pomocą winscp jest jak 5 linii, zobacz ich stronę internetową.
jiggunjer

I to jest dla systemu Windows. Mówimy tutaj o Linuksie.
Gizmo_the_Great 28.08.16

@Gizmo_the_Great Z pewnością skorzystam z tego.
trognanders

Odpowiedzi:


4

Moją pierwszą wskazówką byłoby nazwać pliki na podstawie daty i godziny ich pobrania. W ten sposób nie będziesz musiał nigdzie przechowywać licznika, co byłoby trudne w skrypcie, który nie działa nieprzerwanie, ponieważ jego zmienne byłyby resetowane przy każdym wywołaniu. Możesz przechowywać zmienne w plikach, ale łatwiej jest, jeśli upewnisz się, że nazwy nie kolidują. Coś w stylu, wget http://127.0.0.1:8080/?action=snapshot -O "Snapshot-$(date).jpg"jeśli używasz Bash. (Przepraszam, jeśli składnia nie działa, nie jestem ekspertem od Bash i piszę to w telefonie).

Jak już wspomniałeś, dostępnych jest kilka samouczków dotyczących skryptowania przesyłania FTP. Co najmniej jeden z nich powinien zawierać przykład, który przesyła pliki według wzorca, na przykład „Snapshot - *. Jpg”, w którym symbol wieloznaczny byłby zgodny ze znacznikiem czasu. Możesz też wskazać programowi FTP (np. Lftp lub ncftp, które mają pliki binarne przeznaczone do skryptów) przesłanie wszystkiego do określonego folderu. Następnie wyczyść folder, jeśli program się powiedzie. W ten sposób możesz uruchamiać skrypt tak często, jak chcesz, używając crona lub systemowego timera, i być na tyle elastycznym, aby zawsze próbował przesyłać pliki, których nie udało się później.

Istnieje również oprogramowanie zaprojektowane do samodzielnego wykonywania tego zadania i nie tylko. Jeden z takich programów, z którego sam korzystałem, jest po prostu nazywany „ruchem” i jest dostępny dla większości dystrybucji. Ma wbudowane tryby wyzwalania ruchu (nagrywanie i / lub robienie zdjęć) lub tryby ciągłe. Może być trochę obciążający procesor w systemach takich jak Raspberry-Pi, ale na pewno działa.

Jeśli chcesz nieco to przyspieszyć, być może uruchomisz wiele zdalnych / lokalnych kamer i przeniesiesz wykrywanie ruchu na mocniejszą maszynę centralną, spójrz na Zoneminder. Konfiguracja trwa dłużej i z mojego doświadczenia wynika, że ​​ręcznie ustawiasz właściwe rozdzielczości na kanałach kamery, ale do pewnego stopnia można to zrobić.


1

Chciałbym użyć AWS S3 zamiast serwera FTP w EC2 i narzędzia AWS CLI do przesyłania plików. Jest to znacznie lżejsze rozwiązanie nie wymagające administracji systemem. S3 zapewnia znacznie bardziej trwałe przechowywanie niż woluminy dla EC2.

Pobieranie narzędzia: https://aws.amazon.com/cli/

Odpowiednie dokumenty: http://docs.aws.amazon.com/cli/latest/reference/s3/

Możesz utworzyć użytkownika, który będzie mógł przesyłać tylko do segmentu S3 za pomocą IAM (więc przestępcy nie mogą usunąć plików!)

Zrobiłbym to zadanie, tworząc skrypt bash (lub perl, node.js, ruby, powershell ?, ...), który wywołuje wget i wyświetla nazwę pliku z datetime. Zadzwoń aws s3 cp ...w pętli for, aby przesłać wszystkie pliki w folderze. W pętli, po każdym udanym aws s3 cpwywołaniu każdego pliku, przenieś go do folderu archiwum, aby również zapisać lokalnie. Jeśli nie chcesz, aby lokalne archiwum aws s3 mvautomatycznie wyczyściło rzeczy, które zostały już przesłane.


Świetna rada S Bailey. W końcu poszedłem z tym pomysłem i dołączyłem resztę. Dzięki za wskazówkę!
Gizmo_the_Great

1

Panowie - wielkie dzięki wszystkim, którzy pomogli. Częściowo wszystkie twoje sugestie pomogły mi osiągnąć końcowy wynik. Dlatego udzieliłem wam wszystkich podziękowań za odpowiedzi, ale zamieściłem poniżej własną odpowiedź w nadziei, że będzie ona przydatna dla innych. Zdaję sobie sprawę, że generalnie nie jest to zrobione, ale w tym przypadku istnieje wiele obszarów, w których można znaleźć rozwiązanie, więc związałem to wszystko w jeden poniżej.

Zainstaluj usługi potrzebne do korzystania z AWS S3

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

Zarejestruj się w usłudze AWS S3 za pomocą własnego konta Amazon: https://aws.amazon.com/s3/

Zdefiniuj nowy klucz dostępu do swojego konta użytkownika poprzez „Klucze dostępu -> Utwórz nowy klucz dostępu” i pobierz plik CSV, gdy zostanie wyświetlony. Jeśli tego nie zrobisz, nie będziesz mógł korzystać z funkcji S3 wiersza polecenia: https://console.aws.amazon.com/iam/home?#security_credential

Otwórz plik ROOTKEY.CSV i skopiuj, a następnie wklej zawartą wartość AccessKeyID i wartość SecretKey, gdy pojawi się monit podczas uruchamiania programu „aws config”, który uruchamiasz z wiersza polecenia przed użyciem AWS w systemie Linux.

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

Sprawdź, czy możesz połączyć i przesłać plik z plikiem sample.txt: > aws s3 mv ~/SourceFolder/sample.txt s3://NameOfYourAWSS3Bucket/ AFolderYouHaveCreated

Pobierz i zainstaluj mjpg_streamer zgodnie z instrukcjami kompilacji tutaj: https://github.com/jacksonliam/mjpg-streamer#building--installation Po zakończeniu przejdź do jego folderu

> cd mjpg_streamer

Uruchom streamer mjpg:

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

Sprawdź, czy działa, odwiedzając następujący link w przeglądarce:

http://127.0.0.1:8080/stream.html

Weź pojedynczy plik ze znacznikiem daty i godziny (i zapisz go w lokalnym katalogu, z którego jest wykonywany), używając:

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

Spowoduje to utworzenie pliku w podfolderze „www” folderu mjpeg_streamer o nazwie „output-16-09-01-22-35-30.jpg”, jeśli zostanie wykonany o godzinie 22:35 1 września 2016 r.

Utwórz nowy skrypt bash (na przykład MyScript.sh) i nadaj mu uprawnienia do wykonywania oraz skopiuj zawartość na dole. Po uruchomieniu utworzy JPEG ze znacznikiem czasu co 5 sekund, aż aktualna data stanie się określoną datą końcową. W takim przypadku zaczyna się w dniu A i kończy w dniu B. Zastąp własne daty.

Skopiuj to do skryptu, podstawiając odpowiednie ścieżki:

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

Sugestie dotyczące ulepszeń mile widziane.

Możesz również sprawdzić postęp przechowywania w AWS S3 za pomocą

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

Zostawiłem go na dwie godziny strzelania co 10 sekund i wygenerowało 74 Mb przesłanych plików. Więc ustalam, że będzie to 6,5 Gb na tydzień - mniej niż poziom cen dla usługi, w której zaczynają się koszty, które moim zdaniem wynoszą 8 Gb.

Dzięki jeszcze raz.


1
W odniesieniu do problemów związanych z użytkowaniem przestrzeni S3 pozwala ustawić reguły cyklu życia dla obiektów, które po określonym czasie przeniosą je do tańszego miejsca do przechowywania, takiego jak lodowiec (lub po prostu je usuną). Twój skrypt przesyłania jest prostszy niż wyobrażałem sobie, że mój byłby ... to komplement. Dziękujemy za opublikowanie całego rozwiązania!
trognanders
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.