我有一台 24/7 全天候运行的 Linux 机器(Debian)。我想这样设置它,每天一次连接到特定的 FTP 服务器并检查自上次检查以来是否有任何文件发生更改。如果有,它应该向我发送一封电子邮件,其中包含已更改文件的列表。
检查不必非常彻底 - 如果只是比较文件日期我就很高兴了。但它必须是递归的。
我该怎么做?我知道我可以使用 cron 来安排进程,但我该用什么来连接并检查更改?
答案1
ncftp 客户端具有ncfpls可以执行递归长列表的工具。
答案2
这是使用 Net::FTP 的 Perl 解决方案。以下脚本应打印文件服务器中每个文件的文件名和时间戳。您可以轻松扩展它以满足您的实际需求。
/usr/bin/perl 的 #! 使用严格; 使用 Net::FTP; 使用 File::Listing qw(parse_dir); 使用 POSIX qw(strftime); # 配置选项 我的$FTP_SERVER ='ftp_host_name'; 我的$FTP_USER ='用户名'; 我的$FTP_PASS ='密码'; # 建立 FTP 连接 我的 $ftp = Net::FTP->new($FTP_SERVER, Debug => 0) 或死亡“无法连接到$FTP_SERVER:$@”; $ftp->login($FTP_USER,$FTP_PASS) 复制代码 或者死亡“无法登录”,$ftp->message; $ftp->二进制; # 获取文件列表 我的$files = $ftp->dir; foreach 我的 $entry (parse_dir($files)) { 我的($fileName,$type,$size,$mtime,$mode)= @$entry; 下一步除非 $type eq 'f'; 我的 $timeStamp = strftime "%Y-%m-%d %H:%M:%S", gmtime($mtime); 打印“名称:$fileName\t时间戳:$timeStamp\n”; } $ftp->退出;
答案3
我很确定 lftp 可以编写脚本来执行此操作;否则,我只会使用我最喜欢的脚本语言(Ruby/Perl/Python)的 FTP 库并以这种方式完成工作。
答案4
使用 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 会自动将结果邮寄给您。