การเขียนสคริปต์ชุด sFTP อัปโหลดทุก 1 นาที


8

ฉันต้องการบันทึกวิดีโอส่วนหนึ่งของบ้านด้วยเว็บแคมในขณะที่ฉันไม่อยู่สองสามวันเพื่อลองและตรวจสอบให้แน่ใจว่ามีการถ่ายภาพเบอร์เกอร์และภาพถ่ายที่อัพโหลดไปยังเซิร์ฟเวอร์ของฉันก่อนที่พวกเขาจะรู้ตัว

ฉันติดตั้งเว็บแคมเพื่อสตรีมวิดีโอโดยใช้ mjpg_streamer ใช้งานได้และใช้งานได้ดี

เป็นไปได้ที่จะถ่ายภาพนิ่งจากสตรีมเมื่อใดก็ตามที่คุณต้องการเรียกว่า 'FileName.jpg':

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

ฉันมีเซิร์ฟเวอร์ Amazon FTP พร้อม Amazon Web Services และการเข้าถึง FTP โดยใช้ sFTP ฉันเชื่อมต่อโดยใช้ปลั๊กอิน FireFTP ของ Firefox ในขณะนี้เพื่อให้ทำงานได้ แนวคิดคือทำให้คอมพิวเตอร์ทำงานโดยใช้การเชื่อมต่อสด

ฉันต้องการสคริปต์การถ่ายภาพจากสตรีมบอกทุก ๆ 1 นาทีและอัปโหลดรูปภาพไปยังเซิร์ฟเวอร์ของฉันผ่านการเชื่อมต่อ FTP สดและมีไฟล์ต้นฉบับถูกลบออกจากพีซีของฉันเพื่อให้ไฟล์ถัดไปจะบันทึก O หรือต่อท้ายหมายเลขของไฟล์แต่ละไฟล์แล้ว FTP มันขึ้นมา เช่น FileName1.jpeg, Filename2.jpeg

ฉันใช้ Google หลายชั่วโมงและแม้ว่าจะมีโพสต์มากมายเกี่ยวกับการเขียนสคริปต์การอัปโหลด FTP แต่ฉันไม่สามารถค้นหาการอัปโหลดกระแสข้อมูลอย่างต่อเนื่อง ... เช่น "ดูโฟลเดอร์นี้อัปโหลดเนื้อหาทุก ๆ 1 นาทีหลังจากนั้นหนึ่งนาที อัปโหลดเนื้อหาใหม่ใด ๆ ที่อยู่ในนั้น "

ฉันเดาว่าฉันต้องการสคริปต์ทุบตีที่จะ:

  • เก็บตัวนับไว้เพื่อให้ไฟล์ที่สร้างขึ้นใหม่แต่ละไฟล์มีชื่อแตกต่างกัน
  • ส่งชื่อไฟล์นั้นไปที่ "wget http://127.0.0.1:8080/?action=snapshot -O FileName XX .jpg" ทุก ๆ 30 วินาทีหรือ 1 นาที
  • อัปโหลด FileName XX .jpg ไปยังเซิร์ฟเวอร์ FTP

แต่ฉันไม่รู้ว่าจะทำยังไง! ทุกคนสามารถชี้นำฉันได้ไหม หรือใครรู้วิธีที่จะทำกับ FileZilla หรืออะไรบางอย่าง (ซึ่งไม่สามารถดูโฟลเดอร์ AFAIK: https://forum.filezilla-project.org/viewtopic.php?t=41609 ?


1
เหตุใดจึงต้องใช้เซิร์ฟเวอร์ FTP ใน EC2 เมื่อคุณสามารถใช้ S3 และไคลเอนต์ AWS CLI สำหรับการอัปโหลดไฟล์ได้ในราคาที่เหมาะสม
trognanders

ฉันมีหนึ่งในคนฟรี afaik ถ้าคนที่คุณพูดถึงจะดีกว่าสำหรับงานที่ฉันเคยใช้
Gizmo_the_Great

การคัดลอกไฟล์ไปยัง ftp ด้วย winscp นั้นเหมือนกับ 5 บรรทัดดูเว็บไซต์ของพวกเขา
jiggunjer

และสำหรับ Windows เรากำลังพูดถึงลินุกซ์ที่นี่
Gizmo_the_Great

@Gizmo_the_Great แน่นอนว่าฉันจะใช้อะไร
trognanders

คำตอบ:


4

เคล็ดลับแรกของฉันคือตั้งชื่อไฟล์โดยใช้วันที่และเวลาที่ถ่าย ด้วยวิธีนี้คุณไม่จำเป็นต้องเก็บตัวนับไว้ที่ไหนก็ได้ซึ่งจะยากในสคริปต์ที่ไม่ทำงานอย่างต่อเนื่องเนื่องจากตัวแปรจะถูกรีเซ็ตในการเรียกใช้แต่ละครั้ง คุณสามารถเก็บตัวแปรไว้ในไฟล์ได้ แต่จะง่ายกว่าถ้าคุณมั่นใจว่าชื่อจะไม่ถูกชนกัน มีบางอย่างที่เหมือนกับwget http://127.0.0.1:8080/?action=snapshot -O "Snapshot-$(date).jpg"ว่าคุณกำลังใช้ Bash (ขออภัยถ้าไวยากรณ์ไม่ทำงานฉันไม่มีผู้เชี่ยวชาญทุบตีและฉันพิมพ์สิ่งนี้ลงในโทรศัพท์ของฉัน)

อย่างที่คุณพูดถึงมีบทเรียนหลายบทเกี่ยวกับการอัพโหลดสคริปต์ FTP ที่มีให้ อย่างน้อยหนึ่งในนั้นควรมีตัวอย่างที่อัปโหลดไฟล์ตามรูปแบบเช่น "Snapshot - *. jpg" โดยที่ wildcard จะตรงกับการประทับเวลา หรือคุณสามารถชี้โปรแกรม FTP (เช่น lftp หรือ ncftp ซึ่งมีไบนารีสำหรับการเขียนสคริปต์) เพื่ออัปโหลดทุกอย่างในโฟลเดอร์ที่ต้องการ จากนั้นเช็ดโฟลเดอร์หากโปรแกรมสำเร็จ ด้วยวิธีนี้คุณสามารถเรียกใช้สคริปต์ได้บ่อยเท่าที่คุณต้องการโดยใช้ cron หรือ systemd timer และมีความยืดหยุ่นเพียงพอที่จะพยายามอัปโหลดไฟล์ใด ๆ ที่ไม่ประสบความสำเร็จในครั้งต่อไป

นอกจากนี้ยังมีซอฟต์แวร์ที่ออกแบบมาเพื่อทำงานนี้และอื่น ๆ ด้วยตัวเอง โปรแกรมหนึ่งอย่างที่ฉันใช้เองเรียกว่า "โมชั่น" และมีให้สำหรับการแจกแจงส่วนใหญ่ มันมีการเรียกการเคลื่อนไหวในตัว (บันทึกและ / หรือถ่ายภาพรวม) หรือโหมดต่อเนื่อง มันอาจจะเป็น CPU ที่ค่อนข้างเข้มข้นในระบบเช่น Raspberry-Pi แต่ก็ใช้งานได้อย่างแน่นอน

หากคุณต้องการเพิ่มระดับขึ้นเล็กน้อยอาจใช้กล้องระยะไกล / หลายตัวในท้องที่และให้การตรวจจับการเคลื่อนไหวถูกโหลดไปยังเครื่องกลางที่ทรงพลังกว่าดู Zoneminder ใช้เวลาในการตั้งค่านานกว่าและอยู่ในประสบการณ์ของฉันที่เลือกคุณเกี่ยวกับการตั้งค่าความละเอียดที่ถูกต้องในฟีดกล้องของคุณด้วยตนเอง แต่มันสามารถเขียนสคริปต์ได้ในระดับหนึ่ง


1

ฉันจะใช้ AWS S3 แทนเซิร์ฟเวอร์ FTP ใน EC2 และเครื่องมือ AWS CLI เพื่ออัปโหลดไฟล์ มันเป็นวิธีที่เบากว่ามากโดยไม่ต้องดูแลระบบ S3 ให้การจัดเก็บที่ทนทานกว่าปริมาณสำหรับ EC2

ดาวน์โหลดเครื่องมือ: https://aws.amazon.com/cli/

เอกสารที่เกี่ยวข้อง: http://docs.aws.amazon.com/cli/latest/reference/s3/

คุณสามารถสร้างผู้ใช้ที่สามารถอัปโหลดไปยังที่ฝากข้อมูล S3 โดยใช้ IAM เท่านั้น (ดังนั้นอาชญากรจึงไม่สามารถลบไฟล์ได้!)

ฉันจะทำภารกิจนี้ให้สำเร็จด้วยการสร้างสคริปต์ทุบตี (หรือ perl, node.js, ruby, powershell ?, ... ) ที่เรียก wget และส่งออกไปยังชื่อไฟล์ด้วย datetime โทรaws s3 cp ...หาลูปเพื่ออัปโหลดไฟล์ทั้งหมดในโฟลเดอร์ ในลูปเมื่อแต่ละการaws s3 cpโทรที่ประสบความสำเร็จสำหรับแต่ละไฟล์ย้ายไปยังโฟลเดอร์เก็บถาวรเพื่อบันทึกในเครื่องเช่นกัน หากคุณไม่ต้องการให้การจัดเก็บในท้องที่ใช้aws s3 mvเพื่อกำจัดสิ่งที่อัปโหลดไปแล้วอย่างน่าอัศจรรย์โดยอัตโนมัติ


คำแนะนำที่ดี S Bailey ฉันไปกับแนวคิดนั้นในท้ายที่สุดและรวมส่วนที่เหลือไว้ ขอบคุณสำหรับทิป!
Gizmo_the_Great

1

สุภาพบุรุษ - ขอบคุณมากสำหรับทุกสิ่งที่ช่วย ส่วนหนึ่งคำแนะนำทั้งหมดของคุณช่วยให้ฉันได้รับผลลัพธ์ที่เสร็จสมบูรณ์ ดังนั้นฉันจึงให้เครดิตแก่คุณทั้งหมดสำหรับการตอบกลับ แต่ได้โพสต์คำตอบของฉันเองด้านล่างด้วยความหวังว่ามันจะมีประโยชน์สำหรับผู้อื่น ฉันรู้ว่าไม่ใช่สิ่งที่ทำโดยทั่วไป แต่ในกรณีนี้มีหลายพื้นที่ที่ใช้ในการแก้ปัญหาดังนั้นฉันจึงผูกมันทั้งหมดไว้ด้านล่าง

ติดตั้งบริการที่จำเป็นสำหรับการใช้ AWS S3

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

ลงทะเบียนเพื่อรับบริการ AWS S3 ด้วยบัญชี Amazon ของคุณเอง: https://aws.amazon.com/s3/

กำหนดคีย์การเข้าถึงใหม่สำหรับบัญชีผู้ใช้ของคุณผ่าน 'คีย์การเข้าถึง -> สร้างคีย์การเข้าถึงใหม่' และดาวน์โหลดไฟล์ CSV เมื่อได้รับคำสัญญา หากคุณไม่ทำเช่นนี้คุณจะไม่สามารถใช้ฟังก์ชันบรรทัดคำสั่ง S3 ได้: https://console.aws.amazon.com/iam/home?#security_credential

เปิดไฟล์ ROOTKEY.CSV และคัดลอกแล้ววางค่า AccessKeyID ที่มีอยู่และค่า SecretKey เมื่อได้รับพร้อมท์เมื่อคุณเปิดใช้งาน 'aws configure' ซึ่งคุณเรียกใช้จากบรรทัดคำสั่งก่อนใช้ AWS กับ Linux

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

ทดสอบว่าคุณสามารถเชื่อมต่อและอัปโหลดไฟล์ด้วยไฟล์ sample.txt: > aws s3 mv ~/SourceFolder/sample.txt s3://NameOfYourAWSS3Bucket/ AFolderYouHaveCreated

ดาวน์โหลดและติดตั้ง mjpg_streamer ทำตามคำแนะนำการสร้างที่นี่: https://github.com/jacksonliam/mjpg-streamer#building--installation เมื่อเสร็จแล้วให้ไปที่โฟลเดอร์ของมัน

> cd mjpg_streamer

เริ่ม mjpg streamer:

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

ตรวจสอบว่ามันกำลังทำงานอยู่โดยไปที่ลิงค์ต่อไปนี้ในเว็บเบราว์เซอร์ของคุณ:

http://127.0.0.1:8080/stream.html

ใช้ไฟล์วันที่และเวลาที่ประทับครั้งเดียว (และบันทึกลงใน dir ท้องถิ่นที่ไฟล์ถูกเรียกใช้งาน) ด้วย:

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

สิ่งนี้จะสร้างไฟล์ในโฟลเดอร์ย่อย 'www' ของโฟลเดอร์ mjpeg_streamer ของคุณที่เรียกว่า 'output-16-09-01-22-35-30.jpg' หากเรียกใช้เมื่อ 22:35 ในวันที่ 1 กันยายน 2559

สร้างสคริปต์ทุบตีใหม่ (เช่น MyScript.sh) และให้สิทธิ์ในการปฏิบัติการกับมันและคัดลอกเนื้อหาที่ด้านล่างลงไป เมื่อทำงานจะสร้าง JPEG ที่ประทับเวลาทุก 5 วินาทีจนกระทั่งวันที่ปัจจุบันกลายเป็นวันที่สิ้นสุดที่ระบุ ในกรณีนี้มันเริ่มต้นในวันที่ A และสิ้นสุดในวันที่ B แทนวันที่ของคุณเอง

คัดลอกสิ่งนี้ลงในสคริปต์เปลี่ยนเส้นทางที่เกี่ยวข้อง:

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

ข้อเสนอแนะสำหรับการปรับปรุงยินดีต้อนรับ

นอกจากนี้คุณสามารถตรวจสอบความคืบหน้าของพื้นที่เก็บข้อมูลของคุณใน AWS S3 ได้ด้วย

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

ฉันทิ้งไว้สองชั่วโมงในการยิงทุก ๆ 10 วินาทีและสร้างการอัปโหลด 74Mb ดังนั้นฉันจึงใช้งานได้ 6.5Gb ต่อสัปดาห์ - น้อยกว่าระดับราคาสำหรับบริการที่ค่าใช้จ่ายเริ่มขึ้นซึ่งฉันคิดว่าเป็น 8Gb

ขอบคุณอีกครั้ง.


1
สำหรับเรื่องที่เกี่ยวกับการใช้พื้นที่ S3 ช่วยให้คุณกำหนดกฎวงจรชีวิตสำหรับวัตถุที่จะย้ายไปยังที่เก็บที่ถูกกว่าเช่นธารน้ำแข็ง (หรือลบทิ้ง) หลังจากเวลาที่กำหนด สคริปต์การอัปโหลดของคุณง่ายกว่าที่ฉันเคยเป็นมา ขอบคุณสำหรับการโพสต์โซลูชั่นทั้งหมด!
trognanders
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.