Сценарии пакетной загрузки 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 в настоящее время, так что это работает. Идея состоит в том, чтобы оставить компьютер работающим с подключением к сети.

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

Я гуглил в течение нескольких часов, и, хотя есть множество сообщений о сценариях загрузки по FTP, я не могу найти ничего о постоянном потоке загрузки ... т.е. "Смотреть эту папку, загружать контент каждую минуту, а затем минуту спустя загрузить любой новый контент в нем ".

Я думаю, мне нужен скрипт bash, который будет:

  • вести счетчик, чтобы каждый новый файл получал свое имя
  • Отправляйте это имя файла на "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 ?

Gizmo_the_Great
источник
1
Зачем запускать FTP-сервер в EC2, если вы можете использовать S3 и клиент AWS CLI для загрузки файлов за небольшую плату?
Трогнандерс
У меня есть один из бесплатных афаик. Если бы тот, который вы упомянули, был бы лучше для этой задачи, я бы его использовал?
Gizmo_the_Great
Копирование файлов в ftp с помощью winscp похоже на 5 строк, см. Их веб-сайт.
jiggunjer
И это для Windows. Мы говорим о Linux здесь.
Gizmo_the_Great
@Gizmo_the_Great Это, конечно, то, что я бы использовал.
trognanders

Ответы:

4

Мой первый совет - назвать файлы, используя дату и время, когда они были взяты. Таким образом, вам не нужно хранить счетчик где-либо, что было бы трудно в скрипте, который не работает непрерывно, поскольку его переменные будут сбрасываться при каждом вызове. Вы можете хранить переменные в файлах, но это проще, если вы убедитесь, что имена не будут конфликтовать. Что-то вроде, wget http://127.0.0.1:8080/?action=snapshot -O "Snapshot-$(date).jpg"если вы используете Bash. (Извините, если синтаксис не работает, я не эксперт по Bash, и я набираю это на своем телефоне.)

Как вы упомянули, есть несколько учебных пособий о сценариях загрузки по FTP. По крайней мере, один из них должен был включать пример, который загружает файлы по шаблону, например, «Снимок - *. Jpg», где подстановочный знак будет соответствовать метке времени. Или вы можете указать программе FTP (например, lftp или ncftp, у которой есть двоичные файлы для сценариев), чтобы загрузить все в определенную папку. Затем протрите папку, если программа прошла успешно. Таким образом, вы можете запускать ваш скрипт так часто, как вы хотите, используя cron или системный таймер, и он будет достаточно гибким, чтобы всегда пытаться загружать любые файлы, которые не удалось выполнить с более поздним временем его запуска.

Есть также программное обеспечение, предназначенное для выполнения этой задачи, и многое другое, самостоятельно. Одна из таких программ, которую я использовал сам, называется просто «движение» и доступна для большинства дистрибутивов. Он имеет встроенный запуск движения (запись и / или делать снимки) или непрерывные режимы. В таких системах, как Raspberry-Pi, он может быть немного загружен процессором, но, безусловно, работает.

Если вы хотите немного увеличить его, возможно, запустить несколько удаленных / локальных камер и выгрузить детектор движения на более мощную центральную машину, посмотрите на Zoneminder. Установка занимает больше времени, и по моему опыту привыкает к тому, что вы вручную устанавливаете правильные разрешения на каналах вашей камеры, но это может быть до некоторой степени записано в сценарии.

TwoD
источник
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 и выводит имя файла с указанием даты и времени. Вызовите aws s3 cp ...цикл for, чтобы загрузить все файлы в папке. В цикле после каждого успешного aws s3 cpвызова для каждого файла перемещайте его в папку архива, чтобы также сохранить его локально. Если вы не хотите, чтобы локальный архив использовался aws s3 mvдля автоматической очистки вещей, которые уже были загружены.

trognanders
источник
Отличный совет С. Бейли. Я пошел с этой идеей в конце, и включил остальное. Спасибо за совет!
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 стример:

> 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 секунд, и он генерировал 74Mb загрузок. Таким образом, я работаю, чтобы получить 6,5 ГБ в неделю - меньше, чем уровень цен на услугу, где стоимость возрастает, я думаю, что 8 ГБ.

Еще раз спасибо.

Gizmo_the_Great
источник
1
Что касается использования пространства, S3 позволяет вам устанавливать правила жизненного цикла для объектов, которые будут перемещать их в более дешевое хранилище, например, на ледник (или просто удалять их) через определенное время. Ваш сценарий загрузки проще, чем я представлял, мой ... это комплимент. Спасибо за размещение всего решения!
Трогнандерс