Membuat skrip unggahan batch sFTP setiap 1 menit

8

Saya ingin merekam video bagian dari rumah saya dengan webcam sementara saya pergi selama beberapa hari untuk mencoba dan memastikan setiap burger difoto dan foto diunggah ke server saya bahkan sebelum mereka menyadarinya.

Saya telah menyiapkan webcam untuk streaming rekaman menggunakan mjpg_streamer. Itu berfungsi dan streaming OK.

Dimungkinkan untuk mengambil tangkapan diam dari aliran kapan pun Anda ingin disebut 'FileName.jpg':

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

Saya memiliki server FTP Amazon dengan Layanan Web Amazon dan akses FTP menggunakan sFTP. Saya terhubung menggunakan plugin FireFTP Firefox saat ini, sehingga berfungsi. Idenya adalah membiarkan komputer berjalan dengan koneksi hidup.

Saya ingin membuat skrip pengambilan gambar dari streaming, katakan setiap 1 menit dan minta gambar diunggah ke server saya melalui koneksi FTP langsung, dan hapus file asli dari PC saya sehingga yang berikutnya akan menghemat O atau menambahkan nomor di akhir setiap file dan kemudian FTP ke atas. mis. FileName1.jpeg, Filename2.jpeg.

Saya telah mencari Google selama berjam-jam dan meskipun ada banyak posting tentang pembuatan skrip upload FTP, saya tidak dapat menemukan aliran upload yang konstan ... yaitu "Tonton folder ini, unggah konten setiap 1 menit dan kemudian satu menit kemudian unggah konten baru apa pun yang ada di dalamnya ".

Saya kira saya memerlukan skrip bash yang akan:

  • simpan penghitung agar setiap file yang baru dibuat mendapat nama yang berbeda
  • Kirim nama file itu ke "wget http://127.0.0.1:8080/?action=snapshot -O FileName XX .jpg" setiap 30 detik atau 1 menit
  • Unggah FileName XX .jpg ke server FTP

Tetapi saya tidak tahu bagaimana melakukannya! Adakah yang bisa mengarahkan saya? Atau ada yang tahu cara untuk melakukan dengan FileZilla atau sesuatu (yang tidak dapat menonton folder AFAIK: https://forum.filezilla-project.org/viewtopic.php?t=41609 ?

Gizmo_the_Great
sumber
1
Mengapa menjalankan server FTP di EC2, ketika Anda dapat menggunakan S3 dan klien AWS CLI untuk mengunggah file dengan sebagian kecil dari biayanya?
trognanders
Saya punya satu yang gratis afaik. Jika yang Anda sebutkan akan lebih baik untuk tugas saya akan menggunakan satu?
Gizmo_the_Great
Menyalin file ke ftp dengan winscp seperti 5 baris, lihat situs web mereka.
jiggunjer
Dan itu untuk Windows. Kami berbicara Linux di sini.
Gizmo_the_Great
@Gizmo_the_Great Ini tentu yang akan saya gunakan.
trognanders

Jawaban:

4

Kiat pertama saya adalah memberi nama file menggunakan tanggal dan waktu pengambilan. Dengan begitu Anda tidak perlu menyimpan penghitung di mana pun, yang akan sulit dalam skrip yang tidak berjalan terus-menerus karena variabelnya akan disetel ulang pada setiap permintaan. Anda bisa menyimpan variabel dalam file, tetapi lebih mudah jika Anda memastikan nama tidak akan bertabrakan. Sesuatu seperti wget http://127.0.0.1:8080/?action=snapshot -O "Snapshot-$(date).jpg"jika Anda menggunakan Bash. (Maaf jika sintaksnya tidak berfungsi, saya bukan ahli Bash dan saya mengetik ini di ponsel saya.)

Seperti yang Anda sebutkan, ada beberapa tutorial tentang skrip upload FTP yang tersedia. Setidaknya salah satu dari mereka harus menyertakan contoh yang mengunggah file dengan pola, seperti "Snapshot - *. Jpg", di mana wildcard akan cocok dengan stempel waktu. Atau, Anda bisa mengarahkan program FTP (seperti lftp atau ncftp, yang memiliki biner untuk skrip) untuk mengunggah semuanya dalam folder tertentu. Kemudian bersihkan folder tersebut jika program berhasil. Dengan begitu Anda dapat menjalankan skrip sesering yang Anda inginkan menggunakan cron atau systemd timer, dan membuatnya cukup fleksibel untuk selalu mencoba mengunggah file apa pun yang tidak berhasil dengan waktu berikutnya dijalankan.

Ada juga perangkat lunak yang dirancang untuk melakukan tugas ini, dan banyak lagi, sendiri. Salah satu program seperti itu, yang saya gunakan sendiri, hanya disebut "gerak" dan tersedia untuk sebagian besar distribusi. Ini memiliki pemicu gerakan bawaan (merekam dan / atau mengambil foto) atau mode terus menerus. Ini bisa menjadi CPU-intensif pada sistem seperti Raspberry-Pi, tetapi tentu saja berfungsi.

Jika Anda ingin sedikit meningkatkannya, mungkin jalankan beberapa kamera jarak jauh / lokal, dan deteksi gerak diturunkan ke mesin pusat yang lebih kuat, lihat Zoneminder. Butuh waktu lebih lama untuk mengatur, dan dalam pengalaman saya pilih-pilih tentang Anda secara manual mengatur resolusi yang benar pada umpan kamera Anda, tetapi itu dapat dituliskan pada tingkat tertentu.

TwoD
sumber
1

Saya akan menggunakan AWS S3 daripada server FTP di EC2, dan alat AWS CLI untuk mengunggah file. Ini adalah solusi yang jauh lebih ringan yang tidak memerlukan administrasi sistem. S3 menyediakan penyimpanan yang jauh lebih tahan lama daripada volume untuk EC2.

Unduh alat: https://aws.amazon.com/cli/

Dokumen yang relevan: http://docs.aws.amazon.com/cli/latest/reference/s3/

Anda dapat membuat pengguna yang hanya dapat mengunggah ke keranjang S3 menggunakan IAM (sehingga penjahat tidak dapat menghapus file!)

Saya akan menyelesaikan tugas ini dengan membuat skrip bash (atau perl, node.js, ruby, powershell ?, ...) yang memanggil wget dan output ke nama file dengan datetime. Hubungi aws s3 cp ...loop for untuk mengunggah semua file di folder. Dalam loop, setelah setiap aws s3 cppanggilan yang berhasil untuk setiap file, pindahkan ke folder arsip untuk disimpan secara lokal juga. Jika Anda tidak ingin arsip lokal digunakan aws s3 mvuntuk secara otomatis membersihkan hal-hal yang telah diunggah.

trognanders
sumber
Nasihat yang bagus S Bailey. Saya pergi dengan ide itu pada akhirnya, dan memasukkan sisanya. Terima kasih atas tipnya!
Gizmo_the_Great
1

Tuan-tuan - terima kasih banyak untuk semua yang telah membantu. Sebagian, semua saran Anda telah membantu saya mencapai hasil akhir. Jadi saya telah memberi Anda semua kredit untuk balasan tetapi telah memposting jawaban saya sendiri di bawah ini dengan harapan itu berguna bagi orang lain. Saya menyadari bahwa pada umumnya hal tersebut tidak dilakukan, tetapi dalam hal ini ada banyak area untuk membentuk solusi, jadi saya telah mengikat semuanya menjadi satu di bawah ini.

Instal layanan yang diperlukan untuk menggunakan AWS S3

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

Mendaftar untuk Layanan AWS S3 dengan akun Amazon Anda sendiri: https://aws.amazon.com/s3/

Tetapkan kunci akses baru untuk akun pengguna Anda melalui 'Tombol Akses -> Buat Kunci Akses Baru' dan unduh file CSV saat diminta. Jika Anda tidak melakukan ini, Anda tidak akan dapat menggunakan fungsi S3 baris perintah: https://console.aws.amazon.com/iam/home?#security_credential

Buka file ROOTKEY.CSV dan salin lalu tempel nilai AccessKeyID yang terkandung dan nilai SecretKey ketika diminta ketika Anda meluncurkan 'aws configure', yang Anda luncurkan dari baris perintah sebelum menggunakan AWS dengan Linux.

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

Uji Anda dapat menghubungkan dan mengunggah file dengan file sample.txt: > aws s3 mv ~/SourceFolder/sample.txt s3://NameOfYourAWSS3Bucket/ AFolderYouHaveCreated

Unduh dan instal mjpg_streamer dengan mengikuti instruksi pembuatan di sini: https://github.com/jacksonliam/mjpg-streamer#building--installation Setelah selesai, navigasikan ke foldernya

> cd mjpg_streamer

Mulai streamer mjpg:

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

Periksa apakah sedang berjalan dengan mengunjungi tautan berikut di browser web Anda:

http://127.0.0.1:8080/stream.html

Ambil satu tanggal dan waktu file yang dicap (dan simpan ke direktori lokal dari mana file itu dieksekusi) dengan:

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

Ini akan membuat file di folder 'www' di folder mjpeg_streamer Anda, yang disebut 'output-16-09-01-22-35-30.jpg' jika dieksekusi pada 22:35 pada 1 September 2016.

Buat skrip bash baru (seperti MyScript.sh) dan berikan izin yang dapat dieksekusi padanya dan salin konten di bagian bawah ke dalamnya. Saat dijalankan, ini akan membuat JPEG stempel waktu setiap 5 detik hingga tanggal saat ini menjadi tanggal akhir yang ditentukan. Dalam hal ini, itu dimulai pada tanggal A dan berakhir pada Tanggal B. Ganti tanggal Anda sendiri.

Salin ini ke dalam skrip, menggantikan jalur yang relevan:

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

Saran untuk perbaikan diterima.

Anda juga dapat memeriksa progres penyimpanan Anda di AWS S3 dengan

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

Saya meninggalkannya selama dua jam menembak setiap 10 detik dan itu menghasilkan 74MB unggahan. Jadi saya mengusahakannya menjadi 6.5Gb selama seminggu - kurang dari tingkat harga untuk layanan di mana biaya masuk, yang saya pikir adalah 8Gb.

Terima kasih lagi.

Gizmo_the_Great
sumber
1
Berkenaan dengan masalah penggunaan ruang, S3 memungkinkan Anda untuk mengatur aturan siklus hidup untuk objek yang akan memindahkannya ke penyimpanan yang lebih murah seperti gletser (atau hanya menghapusnya) setelah waktu tertentu. Skrip unggahan Anda lebih sederhana dari yang saya bayangkan, milik saya ... itu adalah pujian. Terima kasih telah memposting seluruh solusi!
trognanders