Сценарии пакетной загрузки 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 ?


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


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


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

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


1
Что касается использования пространства, S3 позволяет вам устанавливать правила жизненного цикла для объектов, которые будут перемещать их в более дешевое хранилище, например, на ледник (или просто удалять их) через определенное время. Ваш сценарий загрузки проще, чем я представлял, мой ... это комплимент. Спасибо за размещение всего решения!
Трогнандерс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.