Viết kịch bản tải lên hàng loạt sFTP cứ sau 1 phút


8

Tôi muốn quay video một phần ngôi nhà của mình bằng webcam trong khi tôi vắng mặt vài ngày để thử và đảm bảo bất kỳ kẻ trộm nào cũng được chụp ảnh và ảnh được tải lên máy chủ của tôi trước khi chúng kịp nhận ra.

Tôi đã thiết lập một webcam để truyền phát cảnh bằng mjpg_streamer. Điều đó hoạt động và đang phát trực tuyến OK.

Có thể chụp ảnh tĩnh từ luồng bất cứ khi nào bạn muốn gọi là 'FileName.jpg':

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

Tôi có máy chủ FTP của Amazon với Dịch vụ web Amazon và truy cập FTP bằng sFTP. Hiện tại tôi đang kết nối bằng plugin FireFTP của Firefox, để nó hoạt động. Ý tưởng là để máy tính chạy với kết nối trực tiếp.

Tôi muốn kịch bản chụp ảnh từ luồng cho biết cứ sau 1 phút và hình ảnh được tải lên máy chủ của tôi thông qua kết nối FTP trực tiếp và xóa tệp gốc khỏi PC để người tiếp theo sẽ lưu O hoặc nối một số vào cuối mỗi tệp và sau đó FTP nó lên. ví dụ: FileName1.jpeg, Filename2.jpeg.

Tôi đã làm việc trong nhiều giờ và mặc dù có rất nhiều bài đăng về kịch bản tải lên FTP, tôi không thể tìm thấy bất kỳ dòng tải lên liên tục nào ... tức là "Xem thư mục này, tải lên nội dung cứ sau 1 phút và sau đó một phút tải lên bất cứ nội dung mới nào trong đó ".

Tôi đoán tôi cần một kịch bản bash sẽ:

  • giữ một bộ đếm để mỗi tệp mới được tạo có một tên khác nhau
  • Gửi tên tệp đó đến "wget http://127.0.0.1:8080/?action=snapshot -O FileName XX .jpg" cứ sau 30 giây hoặc 1 phút
  • Tải lên FileName XX .jpg lên máy chủ FTP

Nhưng tôi không biết làm thế nào để làm điều đó! Bất cứ ai có thể chỉ dẫn tôi? Hoặc có ai biết cách làm với FileZilla hoặc một cái gì đó (không thể xem thư mục AFAIK: https://forum.filezilla-project.org/viewtopic.php?t=41609 ?


1
Tại sao phải chạy máy chủ FTP trong EC2, khi bạn có thể sử dụng máy khách S3 và AWS CLI để tải tệp lên với một phần chi phí?
kẻ phản diện

Tôi có một trong những người miễn phí afaik. Nếu một trong những bạn đề cập sẽ tốt hơn cho nhiệm vụ tôi sử dụng một mặc dù?
Gizmo_the_Great

Sao chép tập tin vào ftp bằng wincp giống như 5 dòng, xem trang web của họ.
jiggunjer

Và nó dành cho Windows. Chúng ta đang nói về Linux ở đây.
Gizmo_the_Great

@Gizmo_the_Great Đó chắc chắn là những gì tôi sẽ sử dụng.
kẻ phản diện

Câu trả lời:


4

Mẹo đầu tiên của tôi sẽ là đặt tên cho các tệp bằng cách sử dụng ngày và thời gian chúng được thực hiện. Bằng cách đó, bạn sẽ không cần phải giữ bộ đếm ở bất cứ đâu, điều này sẽ gây khó khăn cho một tập lệnh không chạy liên tục vì các biến của nó sẽ được đặt lại trên mỗi lần gọi. Bạn có thể lưu trữ các biến trong tệp, nhưng sẽ dễ dàng hơn nếu bạn đảm bảo tên sẽ không bị va chạm. Một cái gì đó giống như wget http://127.0.0.1:8080/?action=snapshot -O "Snapshot-$(date).jpg"nếu bạn đang sử dụng Bash. (Xin lỗi nếu cú ​​pháp không hoạt động, tôi không phải là chuyên gia Bash và tôi đang gõ nó trong điện thoại của mình.)

Giống như bạn đã đề cập, có một số hướng dẫn về kịch bản tải lên FTP có sẵn. Ít nhất một trong số chúng phải bao gồm một ví dụ tải lên các tệp theo một mẫu, chẳng hạn như "Ảnh chụp nhanh - *. Jpg", trong đó ký tự đại diện sẽ khớp với dấu thời gian. Hoặc, bạn có thể trỏ chương trình FTP (như lftp hoặc ncftp, có nhị phân có nghĩa là để tạo kịch bản) để tải lên mọi thứ trong một thư mục nhất định. Sau đó xóa thư mục nếu chương trình thành công. Bằng cách đó, bạn có thể chạy tập lệnh của mình bao nhiêu lần bạn muốn bằng cách sử dụng cron hoặc bộ đếm thời gian hệ thống và có đủ linh hoạt để luôn cố gắng tải lên bất kỳ tệp nào mà nó không thành công trong lần chạy sau.

Ngoài ra còn có phần mềm được thiết kế để thực hiện nhiệm vụ này và hơn thế nữa, một mình. Một chương trình như vậy, mà tôi đã sử dụng bản thân mình, được gọi đơn giản là "chuyển động" và có sẵn cho hầu hết các bản phân phối. Nó có kích hoạt chuyển động tích hợp (ghi và / hoặc chụp ảnh nhanh) hoặc các chế độ liên tục. Nó có thể hơi tốn CPU trên các hệ thống như Raspberry-Pi, nhưng chắc chắn nó hoạt động.

Nếu bạn muốn nâng nó lên một chút, có thể chạy nhiều camera từ xa / cục bộ và phát hiện chuyển động được chuyển sang một máy trung tâm mạnh hơn, hãy xem Zoneminder. Sẽ mất nhiều thời gian hơn để thiết lập và theo kinh nghiệm của tôi, tôi rất kén chọn bạn cài đặt độ phân giải chính xác trên nguồn cấp dữ liệu máy ảnh của mình, nhưng nó có thể được viết kịch bản ở một mức độ nào đó.


1

Tôi sẽ sử dụng AWS S3 thay vì máy chủ FTP trong EC2 và công cụ AWS CLI để tải lên các tệp. Đó là một giải pháp nhẹ hơn nhiều không cần quản trị hệ thống. S3 cung cấp lưu trữ bền hơn nhiều so với âm lượng cho EC2.

Tải xuống công cụ: https://aws.amazon.com/cli/

Các tài liệu liên quan: http://docs.aws.amazon.com/cli/latest/reference/s3/

Bạn có thể tạo người dùng chỉ có thể tải lên nhóm S3 bằng IAM (vì vậy bọn tội phạm không thể xóa các tệp!)

Tôi sẽ hoàn thành nhiệm vụ này bằng cách tạo một tập lệnh bash (hoặc perl, node.js, ruby, powershell?, ...) để gọi wget và xuất thành tên tệp với datetime. Gọi aws s3 cp ...một vòng lặp for để tải lên tất cả các tệp trong thư mục. Trong vòng lặp, theo mỗi aws s3 cpcuộc gọi thành công cho mỗi tệp, hãy chuyển nó vào thư mục lưu trữ để được lưu cục bộ. Nếu bạn không muốn một kho lưu trữ cục bộ sử dụng aws s3 mvđể tự động thanh lọc một cách kỳ diệu những thứ đã được tải lên.


Lời khuyên tuyệt vời S Bailey. Tôi đã đi với ý tưởng đó cuối cùng, và kết hợp phần còn lại. Cảm ơn vì tiền hỗ trợ!
Gizmo_the_Great

1

Gents - cảm ơn tất cả những gì đã giúp đỡ. Một phần, tất cả các đề xuất của bạn đã giúp tôi đi đến kết quả cuối cùng. Vì vậy, tôi đã cung cấp cho bạn tất cả tín dụng cho các câu trả lời nhưng đã đăng câu trả lời của riêng tôi bên dưới với hy vọng nó hữu ích cho những người khác. Tôi nhận ra rằng đó không phải là điều được thực hiện, nhưng trong trường hợp này có nhiều lĩnh vực để hình thành giải pháp, vì vậy tôi đã buộc tất cả vào một bên dưới.

Cài đặt các dịch vụ cần thiết để sử dụng AWS S3

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

Đăng ký Dịch vụ AWS S3 bằng tài khoản Amazon của riêng bạn: https://aws.amazon.com/s3/

Xác định khóa truy cập mới cho tài khoản người dùng của bạn thông qua 'Khóa truy cập -> Tạo khóa truy cập mới' và tải xuống tệp CSV khi được hứa. Nếu bạn không làm điều này, bạn sẽ không thể sử dụng các hàm S3 của dòng lệnh: https://console.aws.amazon.com/iam/home?#security_credential

Mở tệp ROOTKEY.CSV và sao chép rồi dán giá trị AccessKeyID và giá trị SecretKey khi được nhắc khi bạn khởi chạy 'aws configure', mà bạn khởi chạy từ dòng lệnh trước khi sử dụng AWS với Linux.

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

Kiểm tra bạn có thể kết nối và tải lên một tệp bằng tệp sample.txt: > aws s3 mv ~/SourceFolder/sample.txt s3://NameOfYourAWSS3Bucket/ AFolderYouHaveCreated

Tải xuống và cài đặt mjpg_streamer theo hướng dẫn xây dựng tại đây: https://github.com/jackson né / mjpg-streamer #building--installation Sau khi hoàn tất, hãy điều hướng đến thư mục của nó

> cd mjpg_streamer

Bắt đầu truyền phát mjpg:

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

Kiểm tra xem nó có chạy không bằng cách truy cập liên kết sau trong trình duyệt web của bạn:

http://127.0.0.1:8080/stream.html

Lấy một tệp ngày và thời gian được đóng dấu (và lưu nó vào thư mục cục bộ mà nó đang được thực thi) với:

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

Điều này sẽ tạo một tệp trong thư mục con 'www' trong thư mục mjpeg_streamer của bạn, được gọi là 'output-16-09-01-22-35-30.jpg' nếu được thực hiện vào lúc 22:35 ngày 1 tháng 9 năm 2016.

Tạo một tập lệnh bash mới (như MyScript.sh) và cấp quyền thực thi cho nó và sao chép nội dung ở dưới cùng vào nó. Khi chạy, nó sẽ tạo một JPEG được đánh dấu thời gian cứ sau 5 giây cho đến ngày hiện tại trở thành ngày kết thúc được chỉ định. Trong trường hợp này, nó bắt đầu vào ngày A và kết thúc vào ngày B. Thay thế ngày của chính bạn.

Sao chép này vào tập lệnh, thay thế các đường dẫn có liên quan:

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

Đề xuất cải tiến chào mừng.

Ngoài ra, bạn có thể kiểm tra tiến trình lưu trữ của mình trong AWS S3 với

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

Tôi đã để nó trong hai giờ bắn cứ sau 10 giây và nó tạo ra 74Mb lượt tải lên. Vì vậy, tôi tính ra mức 6,5Gb trong một tuần - ít hơn mức giá cho dịch vụ nơi chi phí phát sinh, mà tôi nghĩ là 8Gb.

Cảm ơn một lần nữa.


1
Liên quan đến các vấn đề sử dụng không gian, S3 cho phép bạn đặt quy tắc vòng đời cho các đối tượng sẽ chuyển chúng sang bộ lưu trữ rẻ hơn như sông băng (hoặc chỉ xóa chúng) sau một thời gian xác định. Kịch bản tải lên của bạn đơn giản hơn so với hình ảnh của tôi sẽ là ... đó là một lời khen. Cảm ơn bạn đã đăng toàn bộ giải pháp!
kẻ phản diện
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.