1分ごとのsFTPバッチアップロードのスクリプト


8

家の一部のビデオをウェブカメラで録画したいのですが、数日間外出して、ハンバーガーが撮影され、サーバーにアップロードされている写真を確認します。

mjpg_streamerを使用して映像をストリーミングするようにウェブカメラを設定しました。それは機能し、ストリーミングOKです。

'FileName.jpg'を呼び出したいときはいつでもストリームから静止キャプチャを取得できます。

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

アマゾンウェブサービスとsFTPを使用したFTPアクセスを備えたアマゾンFTPサーバーがあります。現在、FirefoxのFireFTPプラグインを使用して接続しています。アイデアは、接続を維持したままコンピュータを実行したままにすることです。

1分ごとにストリームから写真を撮るスクリプトを作成し、ライブFTP接続を介してサーバーに写真をアップロードし、元のファイルをPCから削除して、次のファイルがOを保存できるようにしたいまたは、各ファイルの最後に番号を追加してFTPで送信します。例:FileName1.jpeg、Filename2.jpeg。

私は何時間もGoogleを使っており、FTPアップロードのスクリプト作成に関する大量の投稿はありますが、一定のアップロードストリームについては何も見つかりません...つまり、「このフォルダーを監視し、コンテンツを1分ごとにアップロードしてから1分後にアップロードします新しいコンテンツをアップロードしてください。」

私は次のようなbashスクリプトが必要だと思います:

  • 新しく作成された各ファイルに異なる名前が付けられるようにカウンターを維持します
  • そのファイル名を30秒または1分ごとに「wget http://127.0.0.1:8080/?action=snapshot -O FileName XX .jpg」に送信します
  • FileName XX .jpgをFTPサーバーにアップロードします。

しかし、私はそれを行う方法がわかりません!誰かが私を指示できますか?または、誰かがFileZillaまたは何かを行う方法を知っていますか?


1
わずかなコストでファイルのアップロードにS3とAWS CLIクライアントを使用できるのに、EC2でFTPサーバーを実行する理由は何ですか?
trognanders

私は無料のものの1つを持っています。あなたが言及したものが私がそれを使うであろう仕事のためにより良いとしたら?
Gizmo_the_Great

winscpを使用してファイルをFTPにコピーするのは5行のようなものです。Webサイトを参照してください。
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アップロードのスクリプト作成に関するチュートリアルがいくつかあります。それらの少なくとも1つには、ワイルドカードがタイムスタンプと一致する「Snapshot-*。jpg」などのパターンでファイルをアップロードする例が含まれている必要があります。または、FTPプログラム(スクリプト用のバイナリーを持つlftpやncftpなど)をポイントして、特定のフォルダー内のすべてをアップロードすることもできます。次に、プログラムが成功した場合は、フォルダーをワイプします。そうすることで、cronまたはsystemdタイマーを使用してスクリプトを好きなだけ実行でき、後で実行したときに成功しなかったファイルを常にアップロードしようとする柔軟性があります。

このタスクを実行するために設計されたソフトウェアなどもあります。私が使用したそのようなプログラムの1つは、単に「モーション」と呼ばれ、ほとんどのディストリビューションで使用できます。モーショントリガー(記録および/またはスナップショットの取得)または連続モードが組み込まれています。Raspberry-Piのようなシステムでは少しCPUに負荷がかかる可能性がありますが、確かに機能します。

少しステップアップしたい場合、複数のリモート/ローカルカメラを実行し、モーション検出をより強力な中央マシンにオフロードする場合は、Zoneminderをご覧ください。設定には時間がかかります。私の経験では、カメラフィードに正しい解像度を手動で設定することについてはうるさいですが、ある程度スクリプト化することもできます。


1

EC2ではFTPサーバーの代わりにAWS S3を使用し、ファイルをアップロードするにはAWS CLIツールを使用しました。システム管理を必要としない、はるかに軽量なソリューションです。S3は、EC2のボリュームよりもはるかに耐久性のあるストレージを提供します。

ツールのダウンロード:https : //aws.amazon.com/cli/

関連ドキュメント:http : //docs.aws.amazon.com/cli/latest/reference/s3/

IAMを使用してS3バケットにのみアップロードできるユーザーを作成できます(そのため、犯罪者はファイルを消去できません!)

このタスクを実行するには、wgetを呼び出して日時付きのファイル名に出力するbash(またはperl、node.js、ruby、powershell?、...)スクリプトを作成します。aws s3 cp ...forループを呼び出して、フォルダー内のすべてのファイルをアップロードします。ループでは、aws s3 cp各ファイルの呼び出しが成功するたびに、ローカルに保存するアーカイブフォルダーに移動します。ローカルアーカイブが不要な場合aws s3 mvは、すでにアップロードされたものを自動的に魔法のように消去します。


素晴らしいアドバイスSベイリー。私は結局その考えに取り組み、残りを取り入れました。先端をありがとう!
Gizmo_the_Great

1

紳士-助けてくれたすべてに感謝します。一部には、あなたの提案のすべてが、私が最終結果を得るのに役立ちました。だから私はあなたに返信に対するすべての信用を与えましたが、それが他の人に役立つことを願って、以下に私自身の答えを投稿しました。これは一般的には完了していませんが、この場合、ソリューションを形成するための多くの領域があるので、すべてを1つにまとめました。

AWS S3を使用するために必要なサービスをインストールする

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

自分のAmazonアカウントでAWS S3サービスにサインアップします:https : //aws.amazon.com/s3/

「アクセスキー->新しいアクセスキーを作成」でユーザーアカウントの新しいアクセスキーを定義し、プロンプトが表示されたらCSVファイルをダウンロードします。これを行わないと、コマンドラインS3関数を使用できなくなります。https//console.aws.amazon.com/iam/home?#security_credential

LinuxでAWSを使用する前にコマンドラインから起動する「aws configure」を起動するときにプロンプ​​トが表示されたら、ROOTKEY.CSVファイルを開き、含まれているAccessKeyID値とSecretKey値をコピーして貼り付けます。

> 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"

Webブラウザーで次のリンクにアクセスして、実行されていることを確認します。

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

これにより、mjpeg_streamerフォルダーの「www」サブフォルダーに、「output-16-09-01-22-35-30.jpg」というファイルが2016年9月1日22:35に実行された場合に作成されます。

新しいbashスクリプト(MyScript.shなど)を作成し、実行権限を付与して、下部にあるコンテンツをその中にコピーします。実行すると、現在の日付が指定された終了日になるまで、5秒ごとにタイムスタンプ付きのJPEGが作成されます。この場合、日付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秒ごとに2時間発砲させたままにし、74Mbのアップロードを生成しました。したがって、1週間で6.5Gbになるように計算しました-コストが発生するサービスの価格帯よりも低く、8Gbだと思います。

再度、感謝します。


1
スペース使用の問題に関して、S3では、指定された時間が経過すると、オブジェクトを氷河などの安価なストレージに移動する(または単に削除する)オブジェクトのライフサイクルルールを設定できます。あなたのアップロードスクリプトは、私が想像していたよりも単純です...それはお世辞です。ソリューション全体を投稿していただきありがとうございます。
trognanders
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.