Сценарій завантаження пакетів sFTP кожні 1 хвилини


8

Я хочу записати відео частини мого будинку за допомогою веб-камери, поки я відсутній на кілька днів, щоб спробувати переконатися, що будь-які бургелери сфотографуються, а фотографія завантажена на мій сервер ще до того, як вони це зрозуміють.

У мене є налаштування веб-камери для передачі кадрів за допомогою mjpg_streamer. Це працює і добре передається.

Можна зробити фотозйомку з потоку, коли ви хочете викликати "FileName.jpg":

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

У мене є FTP-сервер Amazon з веб-службами Amazon та FTP-доступом за допомогою sFTP. На даний момент я підключений за допомогою плагіна FireFTP Firefox, так що це працює. Ідея полягає в тому, щоб комп'ютер працював із з'єднанням у прямому ефірі.

Я б хотів сценарій зйомки з потоку, скажімо, кожні 1 хвилини, а зображення завантажуватиметься на мій сервер через пряме з'єднання FTP, а також видалити оригінальний файл з мого ПК, щоб наступний зберег або додайте число до кінця кожного файлу, а потім FTP. наприклад, FileName1.jpeg, Filename2.jpeg.

Я годинами гугл, і хоча є багато публікацій про створення сценарію завантаження через 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 для завантаження файлів за частку вартості?
трогнандри

У мене є один з вільних afaik. Якщо той, про кого ви згадуєте, був би кращим для завдання, я би скористався ним?
Gizmo_the_Great

Копіювання файлів у ftp за допомогою wincp - це як 5 рядків, дивіться на їхньому веб-сайті.
jiggunjer

І це для Windows. Ми говоримо тут про Linux.
Gizmo_the_Great

@Gizmo_the_Great Це, звичайно, я б використовував.
трогнандри

Відповіді:


4

Першою моєю порадою було б назвати файли, використовуючи дату та час їх зйомки. Таким чином, вам не потрібно буде зберігати лічильник у будь-якому місці, що буде складно в сценарії, який не працює постійно, оскільки його змінні будуть скидатися при кожному виклику. Ви можете зберігати змінні у файлах, але це простіше, якщо ви впевнені, що імена не зіткнуться. Щось на зразок, wget http://127.0.0.1:8080/?action=snapshot -O "Snapshot-$(date).jpg"якщо ви використовуєте Bash. (Вибачте, якщо синтаксис не працює, я не фахівець з Баша, і я набираю це у своєму телефоні.)

Як ви вже згадували, є кілька підручників щодо сценаріїв завантаження FTP. Принаймні одна з них повинна містити приклад, який завантажує файли за зразком, наприклад "Знімок - *. Jpg", де підстановка буде відповідати часовій позначці. Або ви можете вказати програмі FTP (наприклад, lftp або ncftp, у якій є бінарні файли, призначені для сценаріїв), щоб завантажити все у певну папку. Потім витріть папку, якщо програма вдалася. Таким чином, ви можете запускати свій сценарій так часто, як вам потрібно, використовуючи cron або системний таймер, і мати його досить гнучким, щоб завжди намагатися завантажувати будь-які файли, які йому не вдалося з наступним запуском.

Існує також програмне забезпечення, розроблене для виконання цієї задачі, і багато іншого самостійно. Одну з таких програм, яку я використовував сам, просто називають «рух» і доступна для більшості дистрибутивів. Він має вбудований запуск руху (записувати та / або робити знімки) або безперервний режим. Це може бути трохи інтенсивним процесором у таких системах, як 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 (щоб злочинці не могли стерти файли!)

Я б вирішив це завдання, зробивши bash (або perl, node.js, ruby, powershell ?, ...) сценарій, який викликає wget і виводить ім'я файлу з датою timetime. Зателефонуйте aws s3 cp ...в цикл for для завантаження всіх файлів у папку. У циклі, після кожного успішного aws s3 cpвиклику кожного файлу, перемістіть його до папки архіву, щоб зберегти також локально. Якщо ви не хочете, щоб локальний архів використовував aws s3 mvдля автоматичного очищення вже завантажені речі.


Чудова порада Бейлі. Я пішов з цією ідеєю врешті-решт і включив решту. Дякую за пораду!
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/ AFolderYouHaveCreate

Завантажте та встановіть mjpg_streamer, дотримуючись інструкцій зі зборки тут: https://github.com/jacksonliam/mjpg-streamer#building--installation Після завершення перейдіть до його папки

> cd mjpg_streamer

Запустіть стример mjpg:

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

Перевірте, чи працює він, перейшовши за цим посиланням у веб-переглядачі:

http://127.0.0.1:8080/stream.html

Візьміть один файл із печаткою дати та часу (і збережіть його в локальному режимі, з якого він виконується) за допомогою:

> 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 вересня 2016 року.

Створіть новий скрипт bash (наприклад, 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 секунд, і це генерувало 74 Мб завантажень. Тому я працюю над тим, щоб бути тижнем 6,5 Гбіт - менше, ніж рівень ціноутворення на послугу, на якій витрачаються витрати, і я думаю, що це 8 Гб.

Знову дякую.


1
Що стосується проблем використання простору, S3 дозволяє встановити правила життєвого циклу для об'єктів, які перемістять їх до дешевшого сховища, як льодовик (або просто видалити) через визначений час. Ваш сценарій завантаження простіший, ніж я уявляв, що це моє ... це комплімент. Дякуємо за публікацію всього рішення!
трогнандри
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.