每 1 分钟编写一次 sFTP 批量上传脚本

每 1 分钟编写一次 sFTP 批量上传脚本

我想在我外出几天时用网络摄像头录制我家部分区域的视频,以确保在任何窃贼意识到之前就拍到他们的照片并将其上传到我的服务器。

我已经设置了一个网络摄像头,使用 mjpg_streamer 来传输视频。它运行正常,传输正常。

您可以随时从流中捕获名为“FileName.jpg”的静态图像:

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

我有一台 Amazon FTP 服务器,它带有 Amazon Web Services,可以使用 sFTP 进行 FTP 访问。我目前使用 Firefox 的 FireFTP 插件进行连接,所以这样可行。这样做的目的是让计算机保持运行,同时保持连接。

我想编写脚本,每隔 1 分钟从流中拍摄一张照片,并通过实时 FTP 连接将照片上传到我的服务器,然后从我的电脑上删除原始文件,以便下一个文件可以保存 O,或者在每个文件的末尾附加一个数字,然后通过 FTP 上传。例如 FileName1.jpeg、Filename2.jpeg。

我已经在 Google 上搜索了几个小时,尽管有很多关于编写 FTP 上传脚本的帖子,但我找不到任何关于持续上传流的帖子……即“监视此文件夹,每隔 1 分钟上传一次内容,然后一分钟后上传其中的任何新内容”。

我想我需要一个 Bash 脚本来:

  • 保留一个计数器,以便每个新创建的文件都有不同的名称
  • 将该文件名发送到“wgethttp://127.0.0.1:8080/?action=snapshot-O 文件名二十每 30 秒或 1 分钟显示 .jpg
  • 上传文件名二十.jpg 到 FTP 服务器

但我不知道该怎么做!有人能指点我吗?或者有人知道用 FileZilla 或其他东西(据我所知,它不能查看文件夹)的方法吗:https://forum.filezilla-project.org/viewtopic.php?t=41609

答案1

我的第一个建议是使用拍摄日期和时间来命名文件。这样你就不需要在任何地方保留计数器,这对于不连续运行的脚本来说很困难,因为每次调用时它的变量都会被重置。您可以将变量存储在文件中,但如果确保名称不会冲突,这会更容易。就像wget http://127.0.0.1:8080/?action=snapshot -O "Snapshot-$(date).jpg"你使用 Bash 一样。(如果语法不起作用,请原谅,我不是 Bash 专家,我正在手机上输入这段代码。)

正如您所提到的,有几篇关于编写 FTP 上传脚本的教程。其中至少一篇应该包含一个示例,该示例通过某种模式上传文件,例如“Snapshot-*.jpg”,其中通配符将与时间戳匹配。或者,您可以指示 FTP 程序(例如 lftp 或 ncftp,它们具有用于编写脚本的二进制文件)上传某个文件夹中的所有内容。然后,如果程序成功,则擦除该文件夹。这样,您就可以使用 cron 或 systemd 计时器随时运行脚本,并使其足够灵活,以便在稍后的运行时间内始终尝试上传任何未成功的文件。

还有一些软件可以独立完成这项任务,甚至更多。我自己使用过的一个这样的程序简称为“motion”,适用于大多数发行版。它具有内置运动触发(记录和/或拍摄快照)或连续模式。在 Raspberry-Pi 等系统上,它可能有点占用大量 CPU,但它确实有效。

如果您想更进一步,也许可以运行多个远程/本地摄像头,并将运动检测转移到更强大的中央机器上,请查看 Zoneminder。它需要更长的时间来设置,并且根据我的经验,它要求您手动设置摄像头馈送的正确分辨率,但它可以在一定程度上编写脚本。

答案2

我将使用 AWS S3 代替 EC2 中的 FTP 服务器,并使用 AWS CLI 工具上传文件。这是一个更轻量级的解决方案,不需要系统管理。S3 提供的存储比 EC2 的卷更持久。

工具下载:https://aws.amazon.com/cli/

相关文档:http://docs.aws.amazon.com/cli/latest/reference/s3/

您可以创建一个只能使用 IAM 上传到 S3 存储桶的用户(这样犯罪分子就无法删除文件!)

我将通过编写一个 bash(或 perl、node.js、ruby、powershell?等)脚本来完成此任务,该脚本调用 wget 并输出到带有日期时间的文件名。调用aws s3 cp ...for 循环上传文件夹中的所有文件。在循环中,每次成功aws s3 cp调用每个文件后,将其移动到存档文件夹以在本地保存。如果您不想要本地存档,请使用aws s3 mv自动清除已上传的内容。

答案3

先生们,非常感谢所有帮助过我的人。在某种程度上,你们的所有建议都帮助我得到了最终的结果。所以我把所有回复都归功于你们,但我在下面发布了我自己的答案,希望它对其他人有用。我意识到这通常不是应该做的事情,但在这种情况下,有很多方面可以形成解决方案,所以我在下面将它们全部归结为一个。

安装使用AWS S3所需的服务

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

使用你自己的亚马逊账户注册AWS S3 服务:https://aws.amazon.com/s3/

通过“访问密钥 --> 创建新访问密钥”为您的用户帐户定义新的访问密钥,并在提示时下载 CSV 文件。如果不这样做,您将无法使用命令行 S3 功能:https://console.aws.amazon.com/iam/home?#security_credential

打开 ROOTKEY.CSV 文件,并在启动“aws configure”时出现提示时复制并粘贴其中包含的 AccessKeyID 值和 SecretKey 值,在使用 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"

通过 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

欢迎提出改进建议。

此外,您还可以使用以下方式检查 AWS S3 中的存储进度:

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

我让它每 10 秒运行一次,持续了两个小时,上传量为 74Mb。因此,我算出一周的上传量为 6.5Gb - 低于需要付费的服务定价层级,我认为是 8Gb。

再次感谢。

相关内容