我有一个全天候运行的linux系统(Debian)。 我想以这种方式设置它,每天一次它连接到一个特定的FTP服务器,并检查自上次检查以来是否有任何文件已经改变。 如果他们有,它应该给我一个电子邮件与更改的文件列表。
检查不必彻底 – 如果只是比较文件date,我会很高兴。 但它必须是recursion的。
我怎样才能做到这一点? 我知道我可以使用cron来安排这个过程,但是我用什么来连接和检查更改?
ncftp客户端有ncftpls工具可以做一个recursion的长列表。
这是一个使用Net :: FTP的Perl解决scheme。 下面的脚本应该打印文件服务器中每个文件的文件名和时间戳。 您可以轻松地扩展此以适应您的实际需求。
#!的/ usr / bin中/ perl的
严格使用
使用Net :: FTP;
使用File :: Listing qw(parse_dir);
使用POSIX qw(strftime);
#configuration选项
我的$ FTP_SERVER ='ftp_host_name';
我的$ FTP_USER ='用户名';
我的$ FTP_PASS ='密码';
#build立FTP连接
我的$ ftp = Net :: FTP-> new($ FTP_SERVER,Debug => 0)
或死“无法连接到$ FTP_SERVER:$ @”;
$ ftp-> login($ FTP_USER,$ FTP_PASS)
或死“无法login”,$ ftp->消息;
$ FTP->二进制;
#获取文件列表
我的$ files = $ ftp-> dir;
foreach我$入口(parse_dir($文件)){
我($文件名,$types,$大小,$ mtime,$模式)= @ $条目;
除非$ type eq'f';
my $ timeStamp = strftime“%Y-%m-%d%H:%M:%S”,gmtime($ mtime);
打印“名称:$文件名\ t时间戳:$ timeStamp \ n”;
}
$ FTP->退出;
我很确定lftp可以编写脚本来做到这一点; 否则,我只是使用我最喜欢的脚本语言(Ruby / Perl / Python)的FTP库,并以这种方式完成这项工作。
这是一个shell脚本来帮助你的方式。 如果你可以通过ssh执行这个,那么你就完成了。 如果你必须通过FTP来做,那么你会遇到我的老朋友期待 。 祝你好运!
#!/usr/bin/env bash
if [ ! -f .baseline ]; then
echo "No timestamp available for comparison. Exiting."
exit 1
fi
for filename in ./*
do
if [ .baseline -ot "$filename" ]; then
echo "$filename"
fi
done
touch .baseline
使用wget。 第一天:
wget -r -q --spider --no-remove-listing --ftp-user=YOU --ftp-password=YOURSECRET ftp://YOURSERVER 2>&1
该命令将生成一个名为YOURSERVER的本地目录,下面有一个下载的目录树,但每个目录只包含一个名为“.listing”的文件。 可以使用diff命令将.listing文件与旧版本进行比较。
现在每天:
mv YOURSERVER PREVIOUS_DIR wget as above diff -r YOURSERVER PREVIOUS_DIR
这将打印所有不同的行,cron应自动将结果邮寄给您。