每1分钟编写sFTP批处理上传脚本


8

我想在外出几天的时候用摄像头录制我房屋的一部分的视频,以尝试确保所有盗贼都被拍照了,并将照片上传到我的服务器上,然后他们才意识到。

我已经设置了一个网络摄像头,以使用mjpg_streamer播放视频。那行得通,可以流式传输。

只要您想调用'FileName.jpg',就可以从流中进行静态捕获:

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

我有一台具有Amazon Web Services和使用sFTP进行FTP访问的Amazon FTP服务器。我目前使用Firefox的FireFTP插件连接,因此可以正常工作。这样做的目的是使计算机在连接​​正常的情况下运行。

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

我已经在Google上搜索了几个小时,尽管有大量关于编写FTP上传脚本的文章,但我找不到关于源源不断的上传的信息。上传其中的任何新内容”。

我想我需要一个bash脚本,它将:

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

但是我不知道该怎么做!谁能指导我?还是有人知道与FileZilla或某物有关的方法(无法监视文件夹AFAIK:https : //forum.filezilla-project.org/viewtopic.php ? t = 41609 吗?


1
当您只需花费一小部分费用即可使用S3和AWS CLI客户端上载文件时,为什么还要在EC2中运行FTP服务器?
trognanders,2016年

我有一个免费的afaik。如果您提到的那款软件对我的任务比较好,那我还是会用吗?
Gizmo_the_Great

使用winscp将文件复制到ftp就像5行一样,请参见其网站。
jiggunjer

它适用于Windows。我们在这里谈论Linux。
Gizmo_the_Great

@Gizmo_the_Great这肯定是我会用的。
trognanders

Answers:


4

我的第一个技巧是使用文件的日期和时间命名文件。这样,您将无需在任何地方保留计数器,这在脚本无法连续运行的脚本中会很困难,因为脚本的变量将在每次调用时重置。您可以将变量存储在文件中,但是如果确保名称不冲突,则会更容易。就像wget http://127.0.0.1:8080/?action=snapshot -O "Snapshot-$(date).jpg"您使用Bash一样。(很抱歉,如果语法不起作用,我不是Bash专家,而是在手机中键入此信息。)

就像您提到的那样,有一些关于脚本化FTP上传的教程。其中至少应有一个示例,该示例按“ Snapshot-*。jpg”之类的模式上载文件,其中通配符将与时间戳匹配。或者,您可以指向FTP程序(例如lftp或ncftp,它们具有用于脚本的二进制文件)将所有内容上传到某个文件夹中。如果程序成功,则擦除文件夹。这样,您可以使用cron或systemd计时器随意运行脚本,并使其具有足够的灵活性以始终尝试上载在以后运行时未成功执行的任何文件。

还有专门设计用来完成此任务的软件,以及更多其他功能。我自己使用过这样的程序之一,简称为“运动”,可用于大多数发行版。它具有内置的运动触发(记录和/或拍摄快照)或连续模式。在Raspberry-Pi之类的系统上,它可能会占用大量CPU,但确实可以。

如果您想稍微提高一点,也许运行多个远程/本地摄像机,并将运动检测卸载到功能更强大的中央计算机上,请查看Zoneminder。设置需要花费更长的时间,并且根据我的经验,您对手动设置相机Feed的正确分辨率非常挑剔,但是可以在某种程度上编写脚本。


1

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

工具下载: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自动魔术清除已上传的内容。


很好的建议S贝利。最后,我接受了这个主意,将其余的全部并入。谢谢你的提示!
Gizmo_the_Great

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

打开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--安装 完成后,导航至其文件夹

> 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.5 Gb,这比成本上升的服务的定价层还低,我认为是8 Gb。

再次感谢。


1
关于空间使用方面的问题,S3允许您为对象设置生命周期规则,以便在指定时间后将它们移动到更便宜的存储设备(如冰川)中(或只是删除它们)。您的上传脚本比我想象的要简单。。。。感谢您发布整个解决方案!
trognanders
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.