我正在尝试从我的 Windows 桌面访问远程服务器上的大型日志文件。我仅有的对该远程机器具有 FTP 访问权限,而不是 SSH 访问权限。
目前,我正在使用 WinSCP 通过 FTP 下载整个文件。这意味着我每次都必须传输整个文件。但是,鉴于它是一个日志文件,我可能只需要最后几行。
这特别令人沮丧,因为我的带宽严重受限,所以传输整个文件需要几分钟。
tail -100
如果我有 shell 访问权限,就可以通过使用类似获取最后 100 行的方法轻松实现这一点。
我想找到一个解决方案来通过 FTP 执行此操作。请注意,它不必是连续的尾部,只需一次性就足够了。
答案1
您想做的事情,FTP 绝对可以做到。从技术上讲,它与任何 FTP 客户端在恢复中断的文件下载时所做的一样。
虽然从用户的角度来看,我不知道是否有任何 FTP 客户端支持仅指定数量的尾随字节的明确下载。
但是一些 FTP 客户端肯定会允许您下载以前下载的文件的新尾随内容。
特别是使用 WinSCP,只需启动日志文件下载即可。然后,在覆盖确认提示,选择恢复(它位于不按钮)。请注意,只有当源文件大于目标文件时,此选项才可用。
如果您确实只想下载日志的最后几行,您可以欺骗 WinSCP,通过在开始下载之前创建一个大小比日志文件小一点的虚拟本地文件。
您还可以轻松地自动执行上述技巧:
fsutil file createnew mylog.log 100000000
winscp.com /command "open mysession" "get -resume /path_to_log/mylog.log" "exit"
有关替代方案fsutil
,请参阅在 Windows 系统上快速创建大文件?
通过更多的努力,您可以修改脚本以首先检查日志文件大小并自动计算比日志大小小几千字节的虚拟文件大小。
答案2
答案3
我没有听说有任何软件可以满足您的需求。但是如果您是程序员,应该了解如何用 Perl 编写它。
这里我找到了如何获取所有文件的示例。这不是您的解决方案,但它可以帮助您了解如何执行: http://www.perlmonks.org/?node_id=907019
另外,库 Net::FTP 的帮助: http://search.cpan.org/dist/libnet/Net/FTP.pm
使用这个你可以打开到服务器的 ftp 连接(第一个例子)进行授权(第一个例子)
第二个 URL 帮助您如何使用方法获取文件的最后部分:->ascii 将传输模式设置为 ascii 因为这是日志文件->size(FILE)获取文件大小以计算您应该从哪里开始->restart(WHERE)设置文件光标在您想要开始读取的文件中的位置->read(BUFFER,SIZE [,TIMEOUT])直接将小 SIZE 部分读入 BUFFER 变量
另一个函数:length(BUFFER) 告诉你你得到了多少数据。如果它是零,你可能已经到达了 EOF print ("$BUFFER\n") 简单地将缓冲区内容打印到屏幕上
请注意,这不是完全的解决方案,而是一种解决方法。我写这些的唯一原因是可能没有现成的软件可以完成你的任务。
如果您不知道如何编写该程序,只需在 stackoverflow.com 上提问,而不是超级用户。有许多程序员愿意提供帮助。
如果可能的话,检查你的 ftp 站点是否支持断点续传。没有这个功能,读取文件的结尾部分是不可能的。
另一个部分解决方案可能是日志文件轮换,每天或每小时一个文件。这取决于日志文件的增长速度。