it-swarm-ja.com

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

数日間不在のときに家の一部のビデオをウェブカメラで録画して、バーガラーが写真に撮られ、写真がサーバーにアップロードされていることを確認したいと思っています。

Mjpg_streamerを使用してフッテージをストリーミングするようにWebカメラをセットアップしました。それは機能し、ストリーミングは問題ありません。

'FileName.jpg'と呼ばれるときはいつでも、ストリームから静止キャプチャを取得することができます。

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

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

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

私は何時間もグーグルで検索していて、FTPアップロードのスクリプトに関する投稿はたくさんありますが、アップロードの絶え間ない流れについては何も見つかりません...つまり、 「このフォルダを見て、1分ごとにコンテンツをアップロードし、1分後に新しいコンテンツをアップロードしてください」。

私は次のような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

8
Gizmo_the_Great

紳士-助けてくれたすべての人に感謝します。部分的には、あなたの提案のすべてが私が完成した結果に到達するのを助けました。だから私はあなたに返信のすべてのクレジットを与えましたが、それが他の人に役立つことを願って、以下に私自身の答えを投稿しました。それは一般的には行われていないことだと思いますが、この場合、解決策を形成する領域がたくさんあるので、すべてを以下の1つにまとめました。

AWSS3を使用するために必要なサービスをインストールします

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

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

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

ROOTKEY.CSVファイルを開き、含まれているAccessKeyID値とSecretKey値をコピーして貼り付けます。これは、AWSをLinuxで使用する前にコマンドラインから起動する「awsconfigure」の起動時に表示されます。

> 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

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

新しい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

改善のための提案を歓迎します。

また、AWSS3のストレージの進行状況を確認できます。

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

10秒ごとに2時間起動したままにしておくと、74Mbのアップロードが生成されました。したがって、1週間で6.5Gbになるように計算します。これは、コストが発生するサービスの価格帯である8Gbよりも低くなります。

再度、感謝します。

1
Gizmo_the_Great

私の最初のヒントは、ファイルが取得された日時を使用してファイルに名前を付けることです。そうすれば、カウンターをどこかに保持する必要がなくなります。これは、呼び出しごとに変数がリセットされるため、継続的に実行されないスクリプトでは困難です。変数をファイルに保存することもできますが、名前が衝突しないようにすると簡単です。 Bashを使用している場合は、wget http://127.0.0.1:8080/?action=snapshot -O "Snapshot-$(date).jpg"のようなもの。 (構文が機能しない場合は申し訳ありませんが、私はBashの専門家ではなく、電話でこれを入力しています。)

あなたが言ったように、利用可能なFTPアップロードのスクリプトに関するいくつかのチュートリアルがあります。それらの少なくとも1つには、ワイルドカードがタイムスタンプと一致する「Snapshot-*。jpg」などのパターンでファイルをアップロードする例が含まれている必要があります。または、FTPプログラム(スクリプト用のバイナリを持つlftpやncftpなど)を指定して、特定のフォルダーにすべてをアップロードすることもできます。次に、プログラムが成功した場合はフォルダをワイプします。そうすれば、cronまたはsystemdタイマーを使用してスクリプトを何度でも実行でき、後で実行したときに成功しなかったファイルを常にアップロードしようとするのに十分な柔軟性があります。

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

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

4
TwoD

EC2ではFTPサーバーの代わりにAWSS3を使用し、AWSCLIツールを使用してファイルをアップロードします。これは、システム管理を必要としないはるかに軽量なソリューションです。 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?、...)スクリプトを作成します。 forループでaws s3 cp ...を呼び出して、フォルダー内のすべてのファイルをアップロードします。ループでは、各ファイルのaws s3 cp呼び出しが成功するたびに、ファイルをアーカイブフォルダーに移動して、ローカルにも保存します。ローカルアーカイブが必要ない場合は、aws s3 mvを使用して、すでにアップロードされているものを自動的に魔法のように削除します。

1
trognanders